接触 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
  1. FLAG_ACTIVITY_CLEAR_TOP
  1. FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
  1. 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 将不会再被启动。 转载自:http://www.poemcode.net/2010/04/activity-task-intent-filter-flag/

更多相关文章

  1. Android(安卓)启动应用程序方式
  2. android 4.04的应用程序启动过程及与Zygote的交互(基于静态源码分
  3. Android的Task和Activity相关
  4. Android开机启动Activity或者Service方法
  5. 分析Android(安卓)根文件系统启动过程(init守护进程分析)
  6. Android判断程序是否第一次运行
  7. 分析Android(安卓)根文件系统启动过程(init守护进程分析)
  8. android 属性大全
  9. Android基础入门教程——7.2.1 Android(安卓)XML数据解析

随机推荐

  1. 如何学习 Android(安卓)Animation?
  2. Android中——实现RecyclerView长按弹出M
  3. Android通讯录查询篇--ContactsContract.
  4. Android(安卓)GUI系统之SurfaceFlinger(13
  5. Android(安卓)的属性系统
  6. 解决:Android(安卓)App 在运行时候按下 ho
  7. 简洁、高效、可自定义的开源的Android评
  8. "Android"牵手"iOS",WP滚蛋
  9. 设置Android(安卓)Studio启动时打开欢迎
  10. 从AIDL开始谈Android进程间Binder通信机