您的位置:首页 > 移动开发 > Android开发

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

2015-12-16 22:16 274 查看

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,

那么整个后台任务栈都会被切换到前台。



在singleTask启动模式中,提到过某个Activity所需的任务栈,跟一个参数有关。

TaskAffinity,这个参数表示了一个Activity所需要的任务栈的名字,默认为应用的包名。

也可以为每个Activity指定。

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

当taskAffinity和allowTaskReparenting结合的时候,当应用A启动了应用B的某个Activity C,C是默认模式

所以运行在A的任务栈中,然后启动应用B,C发现有了和自己的Affinity名字相同的任务栈,就会转移过去了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android Activity启动