启动模式与任务栈

1.Activity的四种启动模式

standard:默认,不复用,每次创建新实例。
singleTop:栈顶复用,检查栈顶,如果不是要启动的Activity,创建新实例;如果是,就复用。singleTask:栈中复用,检查任务栈,如果没有要启动的Activity,创建新实例;如果有,就把该Activity上方的其他Activity全部推出任务栈,复用该Activity。
singleInstance:单例模式,独享一个任务栈,且只有一个任务栈,只有一个Activity实例。


启动模式说明

问题1:singleTask模式如果不复用Activity,会新建一个Task放入Actvity吗?
只是平时我们没有去更改Activity的taskAffinity属性(默认为包名),那么Activity创建的时候,就放在app同一个任务栈里面了,所以效果等同于Standard模式。假如重新改了taskAffinity则会新建一个任务栈。

问题2:Activity的TaskAffinity属性起什么作用?
仅对启动模式是SingleTask和SingleInstance类型的Activity生效。用于对Task进行分组,假如app里面的ActivityA设置一个新的TaskAffinity(不使用app包名做为默认值),那么以new task方式启动该ActivityA后,home到桌面,从最近打开的任务栈里面可以看到两个不同的任务栈界面,但都运行在同一个app进程里面。

问题3:Activity描述里面的launchMode启动模式和intent里面的Flag启动模式以哪个为准?
如果两个 Activity 均定义 Activity B 应该如何与任务栈关联,则 Activity A 的请求(如 Intent 中所定义)优先级要高于 Activity B 的请求(如其清单文件中所定义)

2.Activity任务栈

任务栈

任务的默认行为总结:任务栈中的 Activity 永远不会重新排列,仅推入和弹出堆栈。当 Activity A 启动 Activity B 时,Activity A 将会停止,但系统会保留其状态(例如,滚动位置和已输入表单中的文本)。如果用户按“返回”按钮,则当前 Activity 会从堆栈弹出并被销毁。 堆栈中的前一个 Activity 恢复执行。销毁 Activity 时,系统不会保留该 Activity 的状态。
系统需要回收内存资源时,可能会完全销毁 Activity;或者进程崩溃后,Activity也被销毁了,进程重启,会重建Activity。在 Activity 被销毁且必须重建时,必须主动使用回调方法onSaveInstanceState()保留 Activity 的状态。
无论 Activity 是在新任务中启动,还是在与启动 Activity 相同的任务中启动,用户按“返回”按钮始终会转到前一个 Activity。 但是,如果启动指定 singleTask 启动模式的 Activity,则当某后台任务中存在该 Activity 的实例时,整个任务都会转移到前台。此时,返回栈包括上移到堆栈顶部的任务中的所有 Activity。

启动模式为“singleTask”的 Activity 添加到返回栈。 如果 Activity 已经是某个拥有自己的返回栈的后台任务的一部分,则整个返回栈也会上移到当前任务的顶部。

问题1:Activity在什么情况下会被销毁重建?
1.Activity处于后台,此时系统资源紧张,会被回收,但任务栈的状态保持不变,用于后续恢复重建。此时的进程是没有被杀死的。
2.Activity横竖屏切换会销毁重建。

问题2:Activity如果崩溃了,系统怎么处理?
比如一个app打开了四个Activity,此时任务栈有四个Activity,顺序为A->B->C->D。现在D崩溃了,进程也挂了。但任务栈没变成了A->B->C(D因为没调用saveInstanceState())。系统会重新去创建C,C在创建的时候就会重新拉起一个新进程。之后从C返回B的时候,B会重新创建,类似的流程A也会发生。

问题3:任务栈task里面的Activity都属于一个进程吗?
任务栈task里面的Activity可以是多个进程的。比如某个进程A里面加载了进程B的某个Activity,那么只存在进程A的任务栈,进程A和进程B都在运行中。

问题4:系统会清理任务栈吗?
如果用户长时间离开任务,则系统会清除所有 Activity 的任务,根 Activity 除外。 当用户再次返回到任务时,仅恢复根 Activity。系统这样做的原因是,经过很长一段时间后,用户可能已经放弃之前执行的操作,返回到任务是要开始执行新的操作。您可以使用下列几个 Activity 属性修改此行为:alwaysRetainTaskState如果在任务的根 Activity 中将此属性设置为 "true",则不会发生刚才所述的默认行为。

问题5:内存不足时,到底是 Activity 被回收呢,还是进程被杀死呢?
Activity 被回收了,而且进程被杀死了,而且一般情况下该进程是后台进程。

问题6:Activity的onCreate(Bundle savedInstanceState)参数什么时候不为空?
当Activity被回收(不管进程有没有被杀死),下次重建的时候就会把上次调用saveInstance()方法保存的内容传递到onCreate的savedInstanceState参数里。用于Activity的重建。这里的重建是跟进程无关的,即使因为崩溃进程重启了,那么重建的Activity还是能收到savedInstanceState参数。特别注意正常退出Activity再打开该Activity,savedInstanceState是空。只有异常情况(包括横竖屏切换,不保留后台活动,崩溃或者被系统强杀进程回收资源)需要重建才会传入有效的savedInstanceState内容。

你可能感兴趣的:(启动模式与任务栈)