Android activity的四种启动模式
概述
Android 的应用之间可以很方便地进行调用,也就是说A 应用可以很方便地在自己的代码中方便地打开B应用的某个页面。
在A 应用中打开B应用中的ActivityB 代码如下:
B的包名为:com.test.b
Intent intent = new Intent();
ComponentName componentName = new ComponentName(
"com.test.b",
"com.test.b.ActivityB");
intent.setComponent(componentName);
try {
startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
我们知道 activity 有四种启动模式: standard, singleTop, singleTask, singleInstance,
可以直接在A androidManifest.xml中指定:android:launchMode=“xxx”
<activity
android:name=".ActivityB"
android:launchMode="singleTop"
android:exported="true"
/>
这样以来,我们不禁有以下疑问:
- 打开的ActivityB 和A 在同一个进程吗?
- 打开的ActivityB 和A 在同一个activity 任务栈中吗?
- 不同的launchMode 下,上述问题的答案一样吗?
不同launchMode的区别
下面为A应用中启动B应用中的ActivityB,B的ActivityB 不同launchMode下的区别
standard(默认)
standard 模式也是默认模式(不指定就为默认)。
- 关于进程:
系统会先检查B 应用是否有启动进程,如果没有会启动一个新的进程来运行ActivityB;否则,用已经存在的B进程运行ActivityB。 - 关于activity栈
ActivityB 会在A应用当前的activity 所在的栈顶。
可以使用这条命令看activity栈
add shell dumpsys activity | grep -Ei “activityRecord”
- 关于activity 的创建
每次startActivity 都创建一个新的activity
singleTop
- 关于进程
和standard一样 - 关于activity栈
和standard一样,会在A应用的activity栈中 - 关于activity的创建
如果ActivityB位于当前栈的栈顶,则直接回调onNewIntent() 方法,而不是创建新的实例; 否则和standard 一样。
所以又叫做栈顶复用模式。
singleTask
- 关于进程
和standard 一样 - 关于activity 栈
在创建之前,先检查 系统中是否存在task 的affinity 属性等于ActivityB 的taskAffinity , 如果不存在,就创建一个新的任务栈;如果存在,会检查该任务栈中是否有 ActivityB 的实例,如果没有,则创建新的,否则,将 该task 中ActivityB 上面的activity 弹出,直到ActivityB 位于栈顶。 - 关于activity 的创建
见上一条
所以singleTask 模式在目标activity已经创建过的情况下具有清栈顶的作用。
singleInstance
- 关于进程
和standard一样 - 关于Activity栈
独享一个单独的栈,即便B应用当前也有自己的栈了,也会为ActivityB单独创建一个新的task栈; - 关于Activity的创建
由于独享栈,其实就是全局单例。如果没有创建过,则创建新的;否则,调用onNewIntent。
总结
- A 和 ActivityB不在同一个进程
- standrad 和singleTop模式下,ActivityB 和启动它的activity 位于同一个栈;二者的区别为singleTop 会复用栈顶的ActivityB的实例(如果栈顶有的话)
- singleTask 和singleInstance 下,ActivityB 和A 的activity不在同一个栈;二者的区别是:
singleInstance 独享一个栈, singleTask在目标Activity存在的情况下具有清栈顶的作用。
singleTop用于不允许连续重复创建页面的场合;
singleTask 一般用于首页;
singleInstance 一般用于 桌面,通讯录,银行app登录页面等对安全、隐私等有特殊要求的场合。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgciiib
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13