- Standard(标准模式):默认的启动模式。每次启动一个Activity时都会创建一个新的实例,不管该实例是否已经存在。该模式适合独立的任务或者多个实例并存的情况。(出现在被打开的task中)
- SingleTop(栈顶复用模式):如果任务栈已经存在一个要启动的Activity实列,就复用该Activity置于栈顶不会重新创建Activity的实列,复用Activity会执行onNewIntent方法,但是onCreate 、onStart方法不会执行,因为它没有改变.如果任务栈中或者任务栈顶没有实例就创建一个Activity实例存入其中,置于栈顶。
使用场景:适合接收通知内容显示页面,当用户从任务栏中进入查看消息内容界面时,如果设置为singleTop时,这样每次行为都使用同一个实例,用户点击返回时不会存在多个消息页面的情况。(出现在被打开的task中) - SingleTask(栈内复用模式):
- 系统会维护一个栈来管理Activity实例,如果要启动的Activity已经在栈中存在,则将该Activity上的所有实例全部出栈,然后调用它的onNewIntent()方法;否则就创建新的实例并放入栈中。**该模式适合作为App的主界面。**主页面设计为SingleTask,当用户点击回到主页时,主页上面的所有Activity都被销毁。
- 如果SingleTask是另一个应用的Activity呢?如果这时候另一个应用已经被打开,那么这个Ac就会被放到另一个应用的栈顶,并且系统会把另一个应用的全部ac拿过来,压在这个应用的上面。如果另一个应用还没被打开,那么只会打开一个Ac并且压在这个应用上面。因此,SingleTask既可以提供给外部,也可以内部使用。
- 另一个应用(taskB)压在原来应用(taskA)的时候,这时候taskB进入后台的话,taskA和taskB就会分离。前台task就变成了taskB,这时候连续按返回键退出了taskB的时候,将会直接回到桌面而不是taskA中。如果这个设计不好,但又确实需要用到singleTask,可以通过设置属性allowTaskReparenting来允许Activity先出现在TaskA中,然后回到桌面的时候打开TaskB时,这个Ac会回到TaskB中并出现在顶端。
- SingleTask保证了只有一个task里有最多一个这个activity
- SingleInstance(单例模式):
- 它的行为模式和singleTask差不多,只是有一个更严格的要求—>一个task里只有它一个activity
使用场景:singleInstance适合需要与程序分离开的页面。它要独自霸占一个task。在这个activity上打开的activity会进入其他的task。singleInstancce适合用来做闹铃提醒,将闹铃提醒与闹铃设置分离。 - 所以SI和ST的区别是,SI被返回后会直接回到原先的app,而ST会在自己的app里回退
- 当SI在栈顶时,用户返回桌面再打开SI自己的app的时候,会发现SI已经消失了,它即不再原先的应用又不在自己的应用。它并没有被销毁,它只是藏了起来,当它再次被打开的时候又会被复用展现在栈顶。这跟taskAffinity冲突有关
- 它的行为模式和singleTask差不多,只是有一个更严格的要求—>一个task里只有它一个activity
- TaskAffinity
- 一个app的所有Activity的默认taskAffinity都是一样的,就是app的包名。
- 默认情况下Activity会进入当前的Task
- 如果是SingleTask,则会进入自己的taskAffinity的Task,如果自己的taskAffinity和当前的Task是同一个,那就直接进入,否则就回到自己的Task,没有则创建。
- 当多个task的taskAffinity相同时,只能有一个显示在最近任务列表,这也是为什么前面提到的SingleInstance会消失的原因。
02-02
03-27
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交