Android开发 —— Activity启动模式
来源:互联网 发布:sql 更新 编辑:程序博客网 时间:2024/05/23 12:26
-- Activity 为什么需要启动模式?
在默认情况下,当我们多次启动同一个 Activity 的时候,系统会创建多个实例并把它们一一放入任务栈中,
当我们单击 back 键,会发现这些 Activity 会一一回退。
注:任务栈是一种“后进先出”的栈结构,每按一下 back 键就会有一个 Activity 出栈,直到栈空为止,
当栈中无任何 Activity 的时候,系统就会回收这个任务栈。
-- Activity 有四种启动模式:standard、singleTop、singleTask 和 singleInstance。
(1) standard 标准模式,也是系统的默认模式。
每次启动一个 Activity 都会重新创建一个新的实例,不管这个实例是否已经存在。
在这种模式下,谁启动了这个 Activity,那么这个 Activity 就运行在启动它的那个 Activity 所在的栈中。
比如 Activity A 启动了 Activity B(B 是标准模式),那么 B 就会进入到 A 所在的栈中。
(2) singleTop 栈顶复用模式。
在这种模式下,如果新 Activity 已经位于任务栈的栈顶,那么此 Activity 不会被重新创建,同时
它的 onNewIntent 方法会被回调,通过此方法的参数我们可以取出当前请求的信息。
需要注意的是,这个 Activity 的 onCreate、onStart 不会被系统调用,因为它并没有发生改变。
如果新 Activity 的实例已存在但不是位于栈顶,那么新 Activity 仍然会重新创建。
举个例子,假设目前栈内的情况为 ABCD,其中 ABCD 为四个 Activity,A 位于栈底,D 位于栈顶,
这个时候假设要再次启动 D,如果 D 的启动模式为 singleTop,那么栈内的情况仍然为 ABCD;
如果 D 的启动模式为 standard,那么由于 D 被重新创建,导致栈内的情况变为 ABCDD。
(3) singleTask 栈内复用模式,这是一种单实例模式。
在这种模式下,只要 Activity 在一个栈中存在,那么多次启动此 Activity 都不会重新创建实例,和 singleTop 一样,系统也会调用其 onNewIntent 。
具体一点,当一个具有 singleTask 模式的 Activity 请求启动后,比如 Activity A,系统首先会寻找是否存在 A 想要的任务栈,
如果不存在,就重新创建一个任务栈,然后创建 A 的实例后把 A 放到栈中。
如果存在 A 所需的任务栈,这时要看 A 是否在栈中有实例存在,如果有实例存在,那么系统就会把 A 调到栈顶并调用它的 onNewIntent 方法,
如果实例不存在,就创建 A 的实例并把 A 压入栈中。
(4) singleInstance:单实例模式。
这是一种加强的 singleTask 模式,它除了具有 singleTask 模式的所有的特性外,还加强了一点,那就是具有此种模式的 Activity 只能单独地位于一个任务栈中。
换句话说,比如 Activity A 是 singleInstance 模式,当 A 启动后,系统会为它创建一个新的任务栈,然后 A 独自在这个新的任务栈中,由于栈内复用的特性,
后续的请求均不会创建新的 Activity,除非这个独特的任务栈被系统销毁了。
-- 如何给 Activity 指定启动模式?
第一种是通过 AndroidManifest 为 Activity 指定启动模式
<activity android:name="com.ljw.android.SecondActivity"
android:launchMode="singleTask"/>
第二种是通过在 Intent 中设置标志位来为 Activity 指定启动模式。
Intent intent = new Intent();intent.setClass(MainActivity.this, SecondActivity.class);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActvity(intent);
首先,优先级上,第二种方式的优先级要高于第一种,当两种方式同时存在时,以第二种方式为准;
其次,上述两种方式在限定范围上有所不同,比如,第一种方式无法直接为 Activity 设定 FLAG_ACTIVITY_CLEAR_TOP 标志,
而第二种方式无法为 Activity 指定 singleInstance 模式。
PS1: 参数 taskAffinity (任务相关性),标志了一个 Actvivty 所需要的任务栈道额名字。
默认情况下,所有 Activity 所需的任务栈的名字为应用的包名。
taskAffinity 属性主要和 singleTask 启动模式或者 allowTaskReparenting 属性配对使用,其他情况下没有意义。
(1) 当 taskAffinity 和 singleTask 启动模式配对使用的时候,它是具有该模式的 Activity 的目前任务栈的名字,
待启动的 Activity 会运行在名字和 taskAffinity 相同的任务栈中。
(2) 当 taskAffinity 和 allowTaskReparenting 结合的时候,这种情况比较复杂,会产生特殊的效果。
略。
PS2: 任务栈分为前台任务栈和后台任务栈,后台任务栈中的 Activity 位于暂停状态,用户可以通过切换将后台任务栈再次调到前台。
- Android开发 —— Activity启动模式
- Android开发9——Activity的启动模式
- Android开发——Activity启动模式详解
- Android开发——Activity启动模式详解
- Android开发:Activity启动模式
- Android——Activity启动模式详解
- 浅析Android—Activity的启动模式
- Android开发之Activity四大启动模式
- android开发的activity启动模式
- Android开发之Activity的启动模式
- Android开发-关于Activity启动模式
- Android开发中Activity的启动模式
- Android开发之Activity launchMode启动模式
- Android开发之---Activity启动模式
- Android开发之Activity的启动模式
- 《Android开发艺术探索》读书笔记——Activity的生命周期和启动模式
- Android开发艺术探索(研读笔记)——02-Activity的启动模式
- 《Android 开发艺术探索》随手笔记——第一章Activity生命周期和启动模式
- 2. Add Two Numbers
- android 使用 charles抓包http https 问题 持续更新
- springcloud(九):配置中心和消息总线(配置中心终结版)
- linkmovementmethod ClickableSpan
- 商城项目实战21:实现图片上传功能
- Android开发 —— Activity启动模式
- 优秀网站
- android开发界面适配设计
- 模式对话框中“static text”控件的字体大小改变
- 手把手教你使用 RxJava 2.0(一)
- 特许市场技术分析师(CMT)推荐材料
- Qt 出现“undefined reference to `vtable for”原因总结
- 商城项目实战22:解决KindEditor上传图片浏览器兼容性问题
- 高速C/C++编译工具(ccache)