Android 四大组件Activity启动模式

1.standard 标准模式

每次启动一个Activity(以下均用Ac表示)都会创建一个实例,不管实例是否存在。
典型多例实现,一个任务栈可以含有多个实例,每个实例也可以属于不同的任务栈。
谁启动了Ac,则新的Ac运行在启动它的Ac所在栈中

2.singleTop 栈顶复用

若新Ac已位于任务栈栈顶,则重新启动不会新建,同时触发 onNewIntent()方法回调,此方法的参数可以取出当前请求的信息。

不是位于栈顶,则新建,调用onCreate(),onStart()

例如:栈内ABCD,四个Ac,A位于栈底,D为栈顶。再次启动D,且启动模式为singleTop,则栈内依然为ABCD.

若启动模式为standard则D重建,栈内为ABCDD

3.singleTask 栈内复用

只要Ac存在于栈内,则重新启动不会重新创建,同singleTop一样,会回调 onNewIntent()方法
若所需任务栈为S1,且任务栈S1的情况为ADBC,栈内复用原则,D不重建,切到栈顶,且调用 onNewIntent(),singleTask具有clearTop效果,所有D上的Ac全部出栈,最后为AD

4. singleInstance 单实例模式

加强的 singleTask,具有 singleTask模式所有特性,另加强一点,此种模式Ac只能单独地位于一个任务栈中,其余任何由该Ac启动的Ac均会放置其余任务栈。

指定启动模式:

1.通过 AndroidManifest 为Activity指定

例如:

<activity

android:name=“com.xxx.MyActivity”

android:launchMode=“singleTask”/>

2.通过intent中设置标志位来为Activity指定

例如:

Intent intent = new Intent();

intent.setClass(MainActivity.this,MyActivity.class);

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

startActivity(intent)
注:方法2优先级更高

另两种方式在限定范围上有所不同比如

第一种方式无法直接为Activity设定FLAG_ACTIVITY_CLEAR_TOP标识,而第二种方式无法为Activity指定singleInstance模式

Activity 常用的 Flags:

1.FLAG_ACTIVITY_NEW_TASK:

指定 singleTask启动模式,其效果与xml中指定相同

实现:

查找是否存在与启动Ac任务相关性(taskAffinitity)的任务栈
同一个APP的Ac任务相关性相同,默认为包名
有,将整个栈移至前台,栈中旧的不变,启动Ac入栈
没有,则新建栈存放
注:用ApplicationContext启动的Ac,那么必须要加上 FLAG_ACTIVITY_NEW_TASK,否则报异常

2.FLAG_ACTIVITY_SINGLE_TOP:

指定singleTop启动模式,与xml指定相同

3.FLAG_ACTIVITY_CLEAR_TOP:

具有此标记的Ac,启动时,位于同一栈中的其上方的Ac均要出栈。

该模式一般需要和 FLAG_ACTIVITY_NEW_TASK配合使用,此时,被启动Ac存在,则调用它的 onNewIntent()

若启动的Ac采用standard模式启动,则它连同之上的Ac均要出栈,系统创建新的Ac实例并入栈

4.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:

具有该标记的Ac不会出现在历史Ac列表中,当不希望用户通过历史列表回到当前Ac时可以使用

xml中指定Ac的属性Android:excludeFromRecents=“true”

5.FLAG_ACTIVITY_REORDER_TO_FRONT

栈内ABCD,启动B,变成ACDB

任务栈

参数 TaskAffinity(任务相关性) 标识了一个Ac所需要的任务栈的名字

默认情况下,所有的Ac所需任务栈的名字为应用的包名

TaskAffinity属性主要和 singleTask启动模式或者 allowTaskReparenting 属性配对使用,在其他情况下没有意义。

另:任务栈分为前台任务栈和后台任务栈,后台任务栈中Ac位于暂停状态。用户可以将后台任务栈再次调起到前台

场景:

TaskAffinity和 singleTask启动模式配合使用,它是具有该模式的Ac的目前任务栈的名字,待启动的Ac会运行在名字和 TaskAffinity一样的任务栈中
TaskAffinity和 allowTaskReparenting属性结合时,比较特殊
例如有两个应用A和B,A启动了B的一个Ac C,然后按下HOME键回到桌面,再点击B app,此时启动的不是B的主Ac,而是Ac C。因为此时C从A的任务栈转移到了B的任务栈。

原理:当B启动后,B创建自己的任务栈,此时系统发现C已经被创建了,所以将C从A的任务栈中转移。

猜你喜欢

转载自blog.csdn.net/qq_32670947/article/details/132490504
今日推荐