Android之LaunchMode(启动模式)

Android之LaunchMode(启动模式)

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设置此Flag不等价将LaunchModel设定为singleTask,仅仅表示将此Activity加入到TaskAffnity指定的任务栈中
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 优劣比较
  1. Flags方式的优先级比在清单文件中的优先级高,两种方式同时设置时Flags的方式会生效
  2. Flags方式不能设置singleInstance
  3. 在AndroidMainfest文件中不能设定FLAG_ACTIVITY_CLEAR_TOP
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值