艺术探索读书笔记(一)--Activity启动模式

standard

  • 标准模式,每次启动一个Activity就重新创建一个新的实例。每个实例也可以属于不同的
    任务栈。
  • 谁启动了这个Activity,这个Activity就运行在启动他的那个Activity所在的栈中。
  • 如果使用ApplicationContext去启动standard模式的Activity会报错,因为非Activity类型的
    Context并没有所谓的任务栈。解决方法是为待启动的Activity指定FLAG_ACTIVITY_NEW_TASK
    标记位,这样启动时就会创建一个新的任务栈。这时启动实际是singleTask模式启动的。

singleTop

  • 栈顶复用模式,如果新Activity已经位于任务栈的栈顶,那么此Activity不会重新创建,只调用
    onNewIntent()方法。OnCreate()ONStart()方法并没有被调用。
  • 如果新Activity没有在栈顶,仍然会重新创建。

singleTask

  • 栈内复用模式。单实例,只要Activity在一个栈中存在,那么多次启动都不会重新创建实例
    ,只调用OnNewIntent()方法,并且clearTop,
  • 栗子Activity A,启动后先寻找是否存在A想要的任务栈(TaskAffinity),不存在就创建
    一个把A放进去,存在的话 有实例?调到栈顶并onNewIntent() : 创建A并压入栈。

singleInstance

  • 单实例模式。加强的singleTask模式,只能单独地位于一个任务栈中。

tips:

  • 假设目前两个任务栈如图,C、D都为SingleTask模式,前台为A、B所在任务栈。现在请求启动D,
    那么整个后台任务栈都会被切换到前台。
    艺术探索读书笔记(一)--Activity启动模式_第1张图片

  • 在singleTask启动模式中,提到过某个Activity所需的任务栈,跟一个参数有关。
    TaskAffinity,这个参数表示了一个Activity所需要的任务栈的名字,默认为应用的包名。
    也可以为每个Activity指定。

  • TaskAffinity属性主要和SingleTask启动模式或者allowTaskReparenting属性配对使用,其他情况没有意义。

  • 当taskAffinity和allowTaskReparenting结合的时候,当应用A启动了应用B的某个Activity C,C是默认模式
    所以运行在A的任务栈中,然后启动应用B,C发现有了和自己的Affinity名字相同的任务栈,就会转移过去了。

你可能感兴趣的:(Android,Activity启动,Android开发)