Android之LaunchMode(启动模式)

Android之LaunchMode(启动模式),第1张

Android之LaunchMode(启动模式)

文章目录 Android之LaunchMode(启动模式)Activity的4种启动模式1.1 standard ------ 标准模式1.2 singleTop1.3 singleTask1.3.1 什么是Activity想要的任务栈 1.4 singleInstance LauncherModel的设定方式2.1 通过Flag动态设定2.2 在AndroidMainfest文件中设定2.3 优劣比较

Activity的4种启动模式

注意: Activity的启动模式将会影响到手机系统的任务栈, 所以想深刻的理解启动模式,一定要先了解怎么去看任务栈,其实很简单输入一条命令即可

 adb shell dumpsys activity activities|grep -E 'Stack|TaskRecord|Hist'

任务栈
任务栈首先是个栈,是一种先进后出的结构,一般显示在我们眼前的Activity就在栈顶,当我们按了back键之后,栈顶活动出站并销毁,这时屏幕会显示现在栈顶所显示的活动, 如果栈为空,这个任务栈将会被系统收回.

1.1 standard ------ 标准模式

这个是Activity的默认启动模式
标准模式就是在一个任务栈里,创建就入栈,销毁就出栈。将被启动的Activity加入到启动它的Activity所属的任务栈中。

==注:==如果用非Activity的Context(比如ApplicationContext)启动Activity,会报错,原因是该Context不存在任务栈。

1.2 singleTop

顾名思义:栈顶复用启动模式

当栈顶的Activity与即将要启动的Activity是同一个时,直接使用栈顶的Activity,因为当前栈顶的Activity正在显示在用户眼前,所以不会重新调用onCreate,onStart方法,但是会回调onPause和onResume方法(先执行onPause方法)。

在复用栈顶的Activity后,会回调该Activity的onNewIntent(Intent)方法。

方法名执行时机参数
onNewIntent(Intent)在复用Activity后执行,执行时机按在onPause和onResume之间该参数Intent代表启动该Activity的Intent

注: 该launcherModel仅仅是栈顶复用,如果重复启动的Activity在栈内,是不会复用的。

1.3 singleTask

栈内复用模式
这个比singleTop模式复杂一些

LunchMode是singleTask的Activity默认具有clearTop效果,会把栈内复用的Activity之上的Activity全部出栈

该LunchMode和SingleTop一样,栈内复用后,会回调onNewIntent(Intent intent)方法,只是该方法的调用时机略有不同

情况回调时机
复用的Activity在栈顶和singleTop一样,会执行该Activity的onPause,onResume方法。onNewIntent的回调时机在这两个方法之间
复用的Activity在栈内会使该Activity栈内之上的Activity出栈,回调该Activity的onStart和onResume方法。onNewIntent的回调时机在这两个方法之间
1.3.1 什么是Activity想要的任务栈

通过命令

adb shell dumpsys activity activities

可以看到任务栈有一个名字

这个名字就是项目的包名。
默认情况下每个Activity想要的任务栈就是任务栈名为它所属项目的包名的任务栈
Activity想要的任务栈可由字段taskAffinity在AndroidMainifest.xml中设定。
taskAffinity属性的设置格式:不能与项目包名一致,并且必须有包名分隔符 .

taskAffinity属性除了可以和singleTask配合使用之外还可以与allowTaskReparenting配合使用实现Activity两个任务栈内的迁移,这里就不细讲了,感兴趣的可以百度

1.4 singleInstance

单实例模式,可以理解为singleTask的加强版,但即将要启动的Activity的LauncherModel是singleInstance时,会重新给为它创建一个任务栈,将它入栈,后续将一直可以复用此Activity,直到栈被销毁。

LauncherModel的设定方式 2.1 通过Flag动态设定
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

常见的Flags有

Flags作用
FLAG_ACTIVITY_NEW_TASK将Activity的LaunchModel设定为singleTask
FLAG_ACTIVITY_SINGLE_TOP将Activity的LaunchModel设定为singleTop
FLAG_ACTIVITY_CLEAR_TOP将栈中Activity之上的其他Activity全部出栈,singleTask默认具有该属性
FLAG_ACTIVITY_EXCLUDE_FROM_TASK该Activity的不会出现在后台任务的列表中,和在Androidmainfest.xml中设定android:excludeFromRecents="true"同一个意思
2.2 在AndroidMainfest文件中设定
android:launchMode="singleTask"
2.3 优劣比较 Flags方式的优先级比在清单文件中的优先级高,两种方式同时设置时Flags的方式会生效Flags方式不能设置singleInstance在AndroidMainfest文件中不能设定FLAG_ACTIVITY_CLEAR_TOP

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/992894.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存