`
liujianguangaaa
  • 浏览: 237483 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

Activity Task 与 Intent Filter Flag

阅读更多

接触 Android 以来,一直觉得对 task、affinity 和 launch mode 一知半解,这几天潜心阅读 Dev Guide 中的Activities and Tasks,简单做下笔记,梳理下这部分的知识。

Android 的一个特色就是 application A 的 activity 可以启动 application B 的 activity,尽管 A 和 B 是毫无干系的,而在用户看来,两个场景紧密联系,视觉上二者构成了一个整体。Android 就是把这种误觉定义为 Task,它既不是 class,也不是 AndroidMainifest.xml 中的一个元素。从表现上看 Task 就像是一个 stack,一个一个的 activity 是构成 stack 的元素,做着入栈 (push) 和出栈 (pop-up)这样简单重复性的劳动。

默认的规则总是满足大多数的应用场景,但是也总会有一些例外打破习以为常的惯例。Task 的默认规则同样并非牢不可破,修改的方法还是有的。借助 Intent 中的 flag 和 AndroidMainifest.xml 中 activity 元素的属性,就可以控制到 Task 里 Activity 的关联关系和行为。

在 android.content.Intent 中一共定义了20种不同的 flag,其中和 Task 紧密关联的有四种:

  1. FLAG_ACTIVITY_NEW_TASK
  2. FLAG_ACTIVITY_CLEAR_TOP
  3. FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
  4. FLAG_ACTIVITY_SINGLE_TOP

在使用这四个 flag 时,一个 Intent 可以设置一个 flag,也可以选择若干个进行组合。

默认情况下,通过 startActivity() 启动一个新的 Activity,新的 Activity 将会和调用者在同一个 stack 中。但是,如果在传递给 startActivity() 的 Intent 对象里包含了 FLAG_ACTION_NEW_TASK,情况将发生变化,–系统将为新的 Activity “寻找”一个不同于调用者的 Task。不过要找的 Task 是不是一定就是 NEW 呢?如果是第一次执行,则这个设想成立,如果说不是,也就是说已经有一个包含此 Activity 的Task 存在,则不会再启动 Activity。

如果 flag 是 FLAG_ACTIVITY_CLEAR_TOP,同时当前的 Task 里已经有了这个 Activity,那么情形又将不一样。Android 不但不会启动新的 Activity 实例,而且还会将 Task 里 该 Activity 之上的所有 Activity 一律结束掉,然后将 Intent 发给这个已存在的 Activity。Activity 收到 Intent 之后,可以在 onNewIntent() 里做下一步的处理,也可以自行结束然后重新创建自己。如果 Activity 在 AndroidMainifest.xml 里将启动模式设置成multiple,– 默认模式,并且 Intent 里也没有设置 FLAG_ACTIVITY_SINGLE_TOP,那么它将选择后者。否则,它将选择前者。FLAG_ACTIVITY_CLEAR_TOP 还可以和 FLAG_ACTION_NEW_TASK 配合使用。

如果 flag 设置的是 FLAG_ACTIVITY_SINGLE_TOP,则意味着如果 Activity 已经是运行在 Task 的 top,则该 Activity 将不会再被启动。

分享到:
评论

相关推荐

    Activity之间的Intent跳转

    比如,`FLAG_ACTIVITY_NEW_TASK`用于在新的任务中启动Activity,`FLAG_ACTIVITY_CLEAR_TOP`则会清除栈顶到目标Activity的所有Activity。 6. **结果回调**: 如果需要从启动的Activity得到返回结果,可以使用`...

    Intents 和Intent filter 理论介绍

    2.6 标志:用于控制 Intent 的行为,例如 FLAG_ACTIVITY_NEW_TASK 可以启动一个新的任务栈。 3. Intent 解析 当 Intent 未指定具体组件时,系统会使用 Intent Filter 来寻找合适的接收者。 3.1 Intent 过滤器 ...

    Intent的Activity转向

    例如,FLAG_ACTIVITY_NEW_TASK用于在新的任务栈中启动Activity,FLAG_ACTIVITY_CLEAR_TOP则会清除所有位于目标Activity之上的Activity。 6. BroadcastReceiver与Intent: 除了Activity,Intent还可以用于触发...

    第3章 Activity与Intent.pptx

    在Intent中,可以设置FLAG_ACTIVITY_NEW_TASK标志来创建新的任务栈,或者使用FLAG_ACTIVITY_CLEAR_TOP清除栈顶到目标Activity之间的所有Activity,使目标Activity重新获得焦点。 总的来说,Activity和Intent是...

    ex07_activity_intent.rar_Intent_android

    Intent还支持各种FLAG,如`FLAG_ACTIVITY_NEW_TASK`用于在新的任务栈中启动Activity,`FLAG_ACTIVITY_CLEAR_TOP`则会清除所有栈上的Activity,只保留目标Activity。此外,还可以使用`FLAG_INCLUDE_STOPPED_PACKAGES...

    Android提高第四篇之Activity+Intent.docx

    Intent还可以携带FLAG,比如FLAG_ACTIVITY_NEW_TASK用于在新的任务栈中启动Activity,FLAG_ACTIVITY_CLEAR_TOP则会清除当前Activity之上所有Activity,使目标Activity回到栈顶。 在AndroidManifest.xml中声明...

    Android的Intent实验

    - `setFlags()`: 设置Intent的标志,影响Intent的处理方式,如FLAG_ACTIVITY_NEW_TASK用于在新的任务栈中启动Activity。 5. **启动Activity** 使用`startActivity(Intent)`方法启动一个Activity。如果Intent是...

    安卓Android源码——(Activity跳转与操作).zip

    8. 使用Intent Flag可以控制Activity的行为,如FLAG_ACTIVITY_NEW_TASK开启新任务,FLAG_ACTIVITY_CLEAR_TOP回到栈顶Activity并清除上面的Activity等。 七、Activity结果的接收 9. 使用startActivityForResult()...

    Android应用源码之Intent1_Intent.zip

    Intent的Flag可以改变启动行为,例如`FLAG_ACTIVITY_NEW_TASK`用于在新的任务栈中启动Activity,`FLAG_ACTIVITY_CLEAR_TOP`则会在目标Activity所在的任务栈顶重新打开该Activity,清除其上的所有Activity。...

    安卓Android源码——Activity设置相同的action进行判断源码.zip

    如果多个Activity的Intent Filter得分相同,系统还会参考Intent的FLAG_ACTIVITY_*标志,比如FLAG_ACTIVITY_REORDER_TO_FRONT、FLAG_ACTIVITY_CLEAR_TASK等,来决定最终启动哪个Activity。 此外,`ActivityInfo`类...

    Android应用源码之Intent_Intent.zip

    Intent的Flags可以控制启动行为,比如`FLAG_ACTIVITY_NEW_TASK`用于在新的任务栈中启动Activity,`FLAG_ACTIVITY_CLEAR_TOP`用于清理栈顶的Activity并返回到该Activity。 8. **Intent的生命周期** 当一个Intent被...

    Intent和Intent Fliter的理解模型模型介绍

    - 常见的标志有 `Intent.FLAG_ACTIVITY_NEW_TASK`、`Intent.FLAG_ACTIVITY_CLEAR_TOP` 等。 - 可以通过 `setFlags()` 或 `addFlags()` 方法来设置和添加标志。 #### 三、Intent Filter **Intent Filter** 是 ...

    经典的android intent 窗口切换 窗口打开

    Intent Flag可以控制Activity的启动行为,例如`FLAG_ACTIVITY_NEW_TASK`表示在新的任务栈中启动Activity,`FLAG_ACTIVITY_CLEAR_TOP`表示清除栈顶到目标Activity之间的所有Activity。 8. **Intent Filter** 隐式...

    android Intent的用法

    - FLAG_ACTIVITY_NEW_TASK:开启新的任务栈,常用于Service启动Activity。 - FLAG_ACTIVITY_CLEAR_TOP:如果目标Activity已经在栈顶,那么栈上的所有Activity都会被清除,只留下目标Activity。 - FLAG_ACTIVITY_...

    intent属性

    5. Flags:标志位,用于设置Intent的行为,如FLAG_ACTIVITY_NEW_TASK用于启动新的任务栈,FLAG_ACTIVITY_CLEAR_TOP用于重新启动目标活动并清除其上面的所有活动。 三、Intent的创建与使用 1. 创建Intent:可以通过...

    android中intent使用示例

    Intent的FLAG常量可以控制启动行为,比如`FLAG_ACTIVITY_NEW_TASK`用于在新的任务栈中启动Activity,`FLAG_ACTIVITY_CLEAR_TOP`则会清除栈顶到目标Activity之间的所有Activity。 5. 开始Activity: 使用`...

    intent传递类内容

    - Intent的Flag可以控制启动行为,例如`FLAG_ACTIVITY_NEW_TASK`表示在新的任务栈中启动Activity,`FLAG_ACTIVITY_CLEAR_TOP`表示如果目标Activity已经在栈顶,则清除其上面的所有Activity。 6. **Intent Filter**...

    intent页面跳转

    9. **FLAGs**:Intent还允许设置各种标志(FLAGs),如`FLAG_ACTIVITY_NEW_TASK`、`FLAG_ACTIVITY_CLEAR_TOP`等,它们可以控制Activity的启动行为,如是否创建新的任务栈、是否清除栈顶的Activity等。 以上是关于...

    Android应用源码之(Activity跳转与操作).zip

    5. **意图过滤器(Intent Filter)**:在AndroidManifest.xml中定义Intent Filter,可以使Activity能够响应特定类型的隐式Intent。例如,设置ACTION_VIEW的过滤器可以让Activity处理特定类型的文件或URL。 6. **...

    安卓Android源码——Intent.rar

    Intent的Flag可以改变Intent的行为,例如FLAG_ACTIVITY_NEW_TASK开启新的任务栈,FLAG_ACTIVITY_CLEAR_TOP则会清除当前任务栈上的所有Activity。 9. **Intent的安全性**: 鉴于Intent的跨组件通信特性,开发者...

Global site tag (gtag.js) - Google Analytics