本文包含内容
- 4中启动模式基本介绍
- 项目中应用场景
- TaskAffinity注意事项
- 面试中被问的几个问题
启动模式
-
standard
- 标准启动模式,系统默认模式
- 每次启动会创建一个新实例,不管这个实例是否存在
- 谁启动了这个Activity,那么Activity就运行在启动这个Activity的Activity所在的栈中
- 如果Activity的启动模式是SingleInstance && 任务栈不是默认的任务栈 , 那么通过该Activity启动Activity,会出现在默认的栈中
- 由于非Activity类型的Context并没有所谓的栈,所以要启动Activity的时候为待启动的Activity添加FLAG_ACTIVITY_NEW_TASK标记位,这样启动的时候会把待启动的Activity添加到默认的Activity栈中即名字为包名的Activity栈。
-
singleTop
- 栈顶复用模式
- 如果待启动的Activity位于栈顶,那么此Activity就不重新创建,会走它的onNewIntent(Bundle b)方法,该Activity的onCreate、onStart不会被系统调用。
- 如果待启动的Activity不位于栈顶,就会重新创建实例
-
SingleTask
- 栈内复用模式
- 只要待启动Activity在栈内存在,就不会重新创建实例,会重新走onNewIntent方法
- clearTop效果,如果待启动Activity上面还有其他Activity会被销毁,让待启动Activity出现在栈顶的位置
-
SingleInstance
-
单实例模式
-
栈内复用 + 单独存在于一个栈中,说明:如果不和TaskAffinity结合使用,那么该Activity还是存在默认(名字为包名)任务栈中,如下:
Running activities (most recent first): TaskRecord{407b51b8 #44 A com.example.androidreview} Run #3: HistoryRecord{407b4f48 com.example.androidreview/.activity.SingleInstanceActivity} TaskRecord{40751b30 #43 A com.example.androidreview} Run #2: HistoryRecord{4072cab0 com.example.androidreview/.MainActivity} Run #1: HistoryRecord{406624b8 com.example.androidreview/.MainActivity} TaskRecord{40697e80 #2 A com.android.launcher} Run #0: HistoryRecord{40696848 com.android.launcher/com.android.launcher2.Launcher}
可见:SingleInstanceActivity和MainActivity都是在com.example.androidreview这个栈内,但是id是不同的,分别是#42,#43
-
应用场景
- standard:普通展示页面
- singleTop :适用于展示通知详情的Activity,在点开某个通知后,再点开一个通知就复用
- singleTask:应用主页
- singleInstance:拨号、闹钟
TaskAffinity
- 这个参数可以翻译为任务相关性。
- 这个参数标识了一个Activity所需要的任务栈的名字
- 默认情况下,所有Activity所需的任务栈的名字是应用的包名。
- 我们通过为Activity设置TaskAffinity来为该Activity设置回退栈,不能和包名相同,否则就相当于没指定了
- TaskAffinity和SingleTask/SingleInstance模式或者allowTaskReparenting属性配对使用。
- TaskAffinity的值为字符串,且中间必须含有包名分隔符"."
- 指定Activity的启动模式为SingleInstance,但是不指定TaskAffinity,那么该Activity还是创建在默认的Activity栈中,并不会创建新的栈
- 在非Activity的Context中启动Activity需要在Intent中添加FLAG_ACTIVITY_NEW_TASK,这样启动的Activity,默认是启动在包名下的Activity栈中。
小伙子你知道吗?
-
在非Activity的context中启动Activity,需要怎么做?这样做会创建一个新的Activity栈吗?
添加FLAG_ACTIVITY_NEW_TASK
会使用默认的Activity栈,即TaskAffinity为包名的的栈
-
一个Activity的启动模式为SingleInstance,启动它会创建一个新的Activity栈吗
经测试,如果指定了Activity为SingleInstance启动模式但是没有设置TaskAffinity,那么不会创建新的Activity栈,还是默认的名字为包名的栈,但是序号是不同的,如上面介绍中看到的。如果自定义TaskAffinity,那么会创建新的Activity栈。