注意: Activity的启动模式将会影响到手机系统的任务栈, 所以想深刻的理解启动模式,一定要先了解怎么去看任务栈,其实很简单输入一条命令即可
adb shell dumpsys activity activities|grep -E 'Stack|TaskRecord|Hist'
任务栈
任务栈首先是个栈,是一种先进后出的结构,一般显示在我们眼前的Activity就在栈顶,当我们按了back键之后,栈顶活动出站并销毁,这时屏幕会显示现在栈顶所显示的活动, 如果栈为空,这个任务栈将会被系统收回.
这个是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的回调时机在这两个方法之间 |
通过命令
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"同一个意思 |
android:launchMode="singleTask"
2.3 优劣比较
Flags方式的优先级比在清单文件中的优先级高,两种方式同时设置时Flags的方式会生效Flags方式不能设置singleInstance在AndroidMainfest文件中不能设定FLAG_ACTIVITY_CLEAR_TOP
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)