`
zhengjiong
  • 浏览: 71346 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

(转)Android Intent.FLAG_NEW_TASK详解,包括其他的标记的一些解释

阅读更多

本文大部分参考自 http://blog.csdn.net/mayingcai1987/article/details/6200909 ,对原文中的讲解FLAG_NEW_TASK地方加了一些自己的观点,用红色标记

1. Task是包含一系列Activity的堆栈, 遵循先进后出原则. 

2. Task默认行为: 

    (1) 前提: Activity A和Activity B在同一个应用中. 

         操作: Activity A启动开僻Task堆栈(堆栈状态: A), 在Activity A中启动Activity B(堆栈状态: AB), 按下BACK返回键(堆栈状态: A). 

    (2) 前提: Activity A和Activity B在同一个应用中, 应用名称为"TaskOne应用".

         操作: 在Launcher中单击"TaskOne应用"图标, Activity A启动开僻Task堆栈, 命名为TaskA(TaskA堆栈状态: A),

                 在Activity A中启动Activity B(TaskA堆栈状态: AB), 按Home键, 返回Launcher, 启动其它应用(如:电子书),

                 开僻一个新Task堆栈, 命名: TaskB, 按Home健, 返回Launcher, 单击"TaskOne应用"图标, 此时TaskA堆栈返回前台,

                 Activity B为栈顶应用, 供用户使用. 

    (3) 前提: Activity A在名称为"TaskOne应用"的应用中, Activity C在名称为"TaskTwo应用"的应用中.

         操作: 在Launcher中单击"TaskOne应用"图标, Activity A启动开僻Task堆栈, 命名为TaskA(TaskA堆栈状态: A),

                 在Activity A中启动Activity C(TaskA堆栈状态: AC),按Home键, 返回Launcher, 启动"TaskTwo应用"即Activity C,

                 开僻新的Task堆栈, 命名为TaskB, 按BACK键返回Launcher, 单击"TaskOne应用"图标, 此时TaskA堆栈返回前台,

                 Activity B为栈顶应用, 供用户使用. 

3. Intent FLAG介绍:

    (1) FLAG_ACTIVITY_NEW_TASK: 设置此状态,记住以下原则,首先会查找是否存在和被启动的Activity具有相同的亲和性的任务栈(即taskAffinity,注意同一个应用程序中的activity的亲和性一样,所以下面的a情况会在同一个栈中,前面这句话有点拗口,请多读几遍),如果有,刚直接把这个栈整体移动到前台,并保持栈中的状态不变,即栈中的activity顺序不变,如果没有,则新建一个栈来存放被启动的activity

         a. 前提: Activity A和Activity B在同一个应用中. 

             操作: Activity A启动开僻Task堆栈(堆栈状态: A), 在Activity A中启动Activity B, 启动Activity B的Intent的Flag设为

                     FLAG_ACTIVITY_NEW_TASK, Activity B被压入Activity A所在堆栈(堆栈状态: AB).

            原因: 默认情况下同一个应用中的所有Activity拥有相同的关系(taskAffinity).

         b. 前提: Activity A在名称为"TaskOne应用"的应用中, Activity C和Activity D在名称为"TaskTwo应用"的应用中.

             操作1: 在Launcher中单击"TaskOne应用"图标, Activity A启动开僻Task堆栈, 命名为TaskA(TaskA堆栈状态: A),

                       在Activity A中启动Activity C, 启动Activity C的Intent的Flag设为FLAG_ACTIVITY_NEW_TASK,

                       Android系统会为Activity C开僻一个新的Task, 命名为TaskB(TaskB堆栈状态: C), 长按Home键, 选择TaskA,

                       Activity A回到前台, 再次启动Activity C(两种情况1.从桌面启动;2.从Activity A启动,两种情况一样), 这时TaskB回到前台, Activity C显示, 供用户使用, 即:

                       包含FLAG_ACTIVITY_NEW_TASK的Intent启动Activity的Task正在运行, 则不会为该Activity创建新的Task,

                       而是将原有的Task返回到前台显示.

             操作2: 在Launcher中单击"TaskOne应用"图标, Activity A启动开僻Task堆栈, 命名为TaskA(TaskA堆栈状态: A),

                       在Activity A中启动Activity C,启动Activity C的Intent的Flag设为FLAG_ACTIVITY_NEW_TASK,

                       Android系统会为Activity C开僻一个新的Task, 命名为TaskB(TaskB堆栈状态: C),  在Activity C中启动

                       Activity D(TaskB的状态: CD) 长按Home键, 选择TaskA, Activity A回到前台, 再次启动Activity C(从桌面或者ActivityA启动,也是一样的),

                       这时TaskB回到前台, Activity D显示,供用户使用.说明了在此种情况下设置FLAG_ACTIVITY_NEW_TASK后,会先查找是不是有Activity C存在的栈,根据亲和             性(taskAffinity),如果有,刚直接把这个栈整体移动到前台,并保持栈中的状态不变,即栈中的顺序不变

    (2) FLAG_ACTIVITY_CLEAR_TOP:

         前提: Activity A, Activity B, Activity C和Activity D在同一个应用中.

         操作: Activity A启动开僻Task堆栈(堆栈状态: A), 在Activity A中启动Activity B(堆栈状态: AB), 在Activity B中启动

                 Activity C(堆栈状态: ABC), 在Activity C中启动Activity D(堆栈状态: ABCD), 在Activity D中启动Activity B,

                 启动Activity B的Intent的Flag设置为FLAG_ACTIVITY_CLEAR_TOP, (堆栈状态: AB).

    (3) FLAG_ACTIVITY_BROUGHT_TO_FRONT:

         前提: Activity A在名称为"TaskOne应用"的应用中, Activity C和Activity D在名称为"TaskTwo应用"的应用中.

         操作: 在Launcher中单击"TaskOne应用"图标, Activity A启动开僻Task堆栈, 命名为TaskA(TaskA堆栈状态: A),

                 在Activity A中启动Activity C,启动Activity C的Intent的Flag设为FLAG_ACTIVITY_NEW_TASK,

                 Android系统会为Activity C开僻一个新的Task, 命名为TaskB(TaskB堆栈状态: C), 在Activity C中启动

                 Activity D(TaskB的堆栈状态: CD), 长按Home键, 选择TaskA, Activity A回到前台, 在Activity A中再次启动Activity C,

                 在启动Activity C的Intent中设置Flag为FLAG_ACTIVITY_BROUGHT_TO_FRONT, TaskB回到前台,

                 Activity C显示, (TaskB的堆栈状态: C).

    (4) FLAG_ACTIVITY_MULTIPLE_TASK:

         与FLAG_ACTIVITY_NEW_TASK结合使用, 首先在Intent中设置FLAG_ACTIVITY_NEW_TASK, 打开Activity,

         则启动一个新Task, 接着在Intent中设置FLAG_ACTIVITY_MULTIPLE_TASK, 再次打开同一个Activity,则还会新启动一个Task.

    (5) FLAG_ACTIVITY_SINGLE_TOP:

         当前Task堆栈中存在ABCD四个Activity, A是栈顶Activity, D为栈底Activity, 存在打开A的Intent中设置了

         FLAG_ACTIVITY_SINGLE_TOP标志, 则会使用栈顶A, 而不会从新New A.

    (6) FLAG_ACTIVITY_RESET_TASK_IF_NEEDED:

         例: 存在Activity A, Activity B, Activity C, Activity A启动开僻Task堆栈, 命名为TaskA(TaskA堆栈状态: A),

              在Activity A中启动Activity B(TaskA堆栈状态: AB), 接着Activity B启动Activity C(TaskA堆栈状态: ABC),

              启动Activity C的Intent中设置FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET标题, 这样TaskA中有一个还原点,

              当有包含FLAG_ACTIVITY_RESET_TASK_IF_NEEDED的Intent请求TaskA堆栈时(比如请求Activity A)

              系统就会将还原点以上的Activity清除, TaskA堆栈中只剩下了AB.

4. launchMode介绍:

    (1) standard: 

         如果启动此Activity的Intent中没有设置FLAG_ACTIVITY_NEW_TASK标志, 则这个Activity与启动他的Activity在同一个Task中,

         如果设置了Activity请参考上面FLAG_ACTIVITY_NEW_TASK的詳細说明,"launchMode"设置为"standard"的

         Activity可以被实例化多次, 可以在Task中的任何位置, 对于一个新的Intent请求就会实例化一次.

   (2) singleTop: 

         如果启动此Activity的Intent中没有设置FLAG_ACTIVITY_NEW_TASK标志, 则这个Activity与启动他的Activity在同一个Task中,

         如果设置了Activity请参考上面FLAG_ACTIVITY_NEW_TASK的詳細说明,"launchMode"设置为"singleTop"的Activity可以被

         实例化多次,  可以在Task中的任何位置, 对于一个新的Intent请求如果在Task栈顶, 则会用栈顶的Activity响影Intent请求,

         而不会重新实例化对象接收请求, 如果没有在栈顶, 则会实例化一个新的对象接收Intent请求.

   (3) singleTask: 

        "launchMode"设置为"singleTask"的Activity总是在栈底, 只能被实例化一次, 它允许其它Activity压入"singleTask"的Activity

         所在的Task栈,如果有新的Intent请求有此标志的Activity, 则系统会清除有此标志的Task栈中的全部Activity,并把此Activity显示出来.

   (4) singleInstance: 

         launchMode"设置为"singleInstance"的Activity总是在栈底, 只能被实例化一次, 不允许其它的Activity压入"singleInstance"

         的Activity所在Task栈,  即整个Task栈中只能有这么一个Activity.

5. taskAffinity属性: 

   (1) taskAffinity属性应和FLAG_ACTIVITY_NEW_TASK标志及allowTaskReparenting属性结合使用, 如果只使用taskAffinity属性,

        请参考上面Task默认的行为.

   (2) 与FLAG_ACTIVITY_NEW_TASK标志结合:

       a. 前题: Activity A和Activity B在同一个应用中, Activity A与Activity B设置不同的taskAffinity属性.

           操作: Activity A启动开僻Task堆栈,命名为TaskA(TaskA堆栈状态: A), 在Activity A中启动Activity B, 启动Activity B

                   的Intent中设置FLAG_ACTIVITY_NEW_TASK标志,这时系统会新开僻一个Task堆栈,TaskB(TaskB堆栈状态: B).

       b. 前题: Activity A在"TaskOne应用"中, Activity C在"TaskTwo应用"中, Activity A和ActivityC设置了相同的taskAffinity属性.

           操作: Activity A启动开僻Task堆栈,命名为TaskA(TaskA堆栈状态: A), 在Activity A中启动Activity C, 启动Activity C的

                   Intent中设置FLAG_ACTIVITY_NEW_TASK标志,这时Activity C会压入与Activity A堆栈相同的TaskA堆栈(TaskA堆栈状态: AC).

   (3) 与allowTaskReparenting属性:

         例: 在"TaskOne应用"中有一个天气预报Activity A, Activity A与"TaskOne应用"中的其它Activity有默认的关系

              (taskAffinity属性都没有设置), 并且allowTaskReparenting属性设置为true, 现在存在一个"TaskTwo应用

              "启动了"TaskOne应用"中的天气预报Activity A,  这时Activity A与"TaskTwo应用"中的Activity在同一个Task,

              命名这个Task堆栈为TaskA, 这时"TaskOne应用"启动, 并且又打开发天气预报Activity A, 这时Activity A会从TaskA堆栈中转移到

              "TaskOne应用"所在的堆栈, 即Activity A可以在多个堆栈中来回转移.       
6. alwaysRetainTaskState属性:

    如果Task堆栈中的Root Activity设置了此属性值为true, 不管出现任何情况, 一直会保留Task栈中Activity的状态.

7. clearTaskOnLaunch属性:    

    如果Task堆栈中的Root Activity设置了此属性值为true, 只要你一离开这个Task栈, 则系统会马上清理除了Root Activity的全部Activity.

8. finishOnTaskLaunch属性:

    如果某Activity设置了finishOnTaskLaunch属性, 只要你一离开这个Task栈, 则系统会马上清除这个Activity,

    不管这个Activity在堆栈的任何位置.

分享到:
评论

相关推荐

    android各组件详解- Intent.

    - `Flags`用于控制Intent的执行方式,如`FLAG_ACTIVITY_NEW_TASK`可确保Intent在一个新的任务栈中运行,适用于需要独立运行的场景。 通过深入理解Intent的各个组成部分,开发者可以更加高效地利用Intent机制,构建...

    详解Android 全局弹出对话框SYSTEM_ALERT_WINDOW权限

    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(i); } }); AlertDialog alertDialog = builder.create(); ``` 2. 设置对话框属性,使其成为全局对话框: ```java alertDialog.setCancelable(false); ...

    android用于打开各种文件的intent.docx

    ### Android用于打开各种文件的Intent知识点详解 #### 一、概述 在Android开发过程中,我们经常需要使用`Intent`来启动应用内的特定功能或者跳转到其他应用来处理某些文件类型(如PDF、PPT、Word文档等)。本文将...

    Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags()

    ### Android Activity 的四种启动模式与 Intent.setFlags()详解 #### 一、Android Activity 四种启动模式 在 Android 应用开发中,Activity 是构成应用的基本单元之一,它负责显示用户界面并处理用户交互。为了更...

    android intent跳转

    ### Android Intent跳转详解 在Android开发中,`Intent`是一种非常重要的机制,它主要用于启动新的活动(Activity)或者向其他组件发送消息。通过Intent,我们可以实现Activity之间的跳转、数据传递等功能,这对于...

    android退出程序

    - `FLAG_ACTIVITY_NEW_TASK` 和 `FLAG_ACTIVITY_RESET_TASK_IF_NEEDED`:这两个标志位的作用是确保新的Intent在一个新的任务栈中启动,即使该Activity已经在其他任务栈中存在也会重启一个新的实例。 - `android.os...

    Android学习总结-Intent详解.doc

    - **Flags(标志位)**:设置Intent的运行模式,比如FLAG_ACTIVITY_NEW_TASK用于在新的任务栈中启动Activity。 3. **Intent Filter匹配过程** 当使用隐式Intent时,系统会遍历所有注册了Intent Filter的组件,...

    Android开发笔记之:Splash的实现详解

    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); overridePendingTransition(R.anim.activity_in, R.anim.splash_out); } }; @Override public void onCreate(Bundle icicle) { ...

    android activity

    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); ``` 6. **Category**:添加 Intent 的类别,如: ```java Intent intent = new Intent(); intent.addCategory(Intent.CATEGORY_DEFAULT); ``` #### 五、...

    一个JPush推送实现示例

    openIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(openIntent); } ``` 7. **统计分析** JPush还提供了丰富的统计分析功能,包括消息送达率、用户活跃度、点击率等,帮助开发者...

    Android 应用按返回键退向后台运行实例代码

    Android 应用按返回键退向后台运行实例代码详解 Android 应用开发中,如何让应用程序按返回键退向后台运行是很多开发者关心的问题。在日常使用中,我们可以看到许多应用程序(如QQ、微信、微博)在按下返回键后,并...

    Android开机自动运行一个程序教程

    sayHelloIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(sayHelloIntent); } } } ``` 3. **配置文件设置** 最后一步是在AndroidManifest.xml文件中进行配置,声明`...

    Android 通过代码安装 APK的方法详解

    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); ``` 这段代码的工作原理是创建一个Intent,设置类名指向系统内置的安装器,并传递APK文件的URI。然后,通过`startActivity()`启动安装流程...

    android reboot 重启

    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); mContext.startActivity(intent); ``` - 上述代码创建了一个意图对象,并设置了相关参数,最后通过`startActivity()`方法启动该意图,从而触发重启流程。 3. ...

    android编程技巧详细

    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); ``` #### 屏幕亮度控制:动态调整屏幕亮度 为了节省电量或适应不同场景,开发者可以通过修改`WindowManager.LayoutParams`中的`...

    《intent详解(二)》源码

    Intent的FLAGs影响Intent的行为,例如FLAG_ACTIVITY_NEW_TASK表示在新的任务栈中启动Activity,FLAG_ACTIVITY_CLEAR_TOP则会清除当前任务栈中的所有Activity。 12. 深度学习 深入理解Intent的源码,可以从`...

    面试题 目 精心选择

    2. **Intent标记(Flags)详解**:Intent提供了一系列标记来控制Intent的行为,常见的包括: - `FLAG_ACTIVITY_BROUGHT_TO_FRONT`:把目标Activity放到前台。 - `FLAG_ACTIVITY_CLEAR_TOP`:清除到目标Activity...

    android 完美退出程序

    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(startMain); System.exit(0); ``` - 该方法仅保证回到Home页面,但对于有服务(Service)的应用来说,服务可能仍然在后台运行。 3. **强制...

Global site tag (gtag.js) - Google Analytics