Android - Activity LaunchMode 简例

2019-03-26  本文已影响0人  拾识物者

本文不详细介绍基础概念,适合一知半解,想要彻底弄清楚的同学食用。

Activity 的 LaunchMode 有四种取值:

这个取值有两方面的影响:

  1. 是否创建新的 Activity 实例
  2. 创建的 Activity 实例在哪个 task 里

是否创建新的 Activity 实例

如果创建新的 Activity 实例,那么一定是走 onCreate() > onStart() > onResume() 这个生命周期路线。

如果不创建,也就是复用之前存在的,则一定会调用 onNewIntent(),其他生命周期方法视具体情况而定。

创建的 Activity 实例在哪个 task 里

taskAffinity 属性

基本规则

验证方法

打印 taskAffinity、taskId、launchMode

private static String[] S = {
    "standard", "singleTop", "singleTask", "singleInstance"};
public static String getTaskDebugString(Activity activity) {
    try {
        ActivityInfo info = activity.getPackageManager()
            .getActivityInfo(
                activity.getComponentName(), 
                PackageManager.GET_META_DATA);
        return info.taskAffinity + "#" + activity.getTaskId()
            + "(" + S[info.launchMode] + ")";
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
        return "";
    }
}

一些例子

以下表格表示各种组合情况下,启动 Main > A > B 的过程中,获取的 task 的信息。

以下表格内 standard(A) 表示 standard 模式,括号表示设置的 taskAffinity。

Main A B Task(Main,A,B) 解析
standard singleInstance standard X,Y,X singleInstance就是和别人不一样
standard(P) singleInstance standard(P) X,Y,X 显式设置相同的 taskAffinity,其实跟不设置是一样的
standard(P) singleInstance standard(Q) X,Y,Z 具有不同taskAffinity的standard中间插一个singleInstance,也放在了不同的task中
standard(P) singleInstance(P) standard(P) X,Y,X 即使手动设置了singleInstance的taskAffinity,也是没有影响,不会和别的在一个task内
singleIntance standard(P) standard(Q) X,Y,Y standard启动standard会忽略taskAffinity
standard singleTask standard X,X,X Main和A的taskAffinity相同,singleTask也不会创建新的task
standard(P) singleTask(P) standard(Q) X,Y,Y 同上
standard singleTask(P) standard(Q) X,Y,Y Main和A的taskAffinity不相同了,就启动了新的task
standard singleTask(P) standard X,Y,Y 即使B与Main的taskAffinity相同,但是standard自己决定不了task要跟启动者相同
singleTask(P) singleTask(Q) standard(P) X,Y,Y -
singleTask(P) singleTask(Q) standard(P,NT) X,Y,X NT表示NEW_TASK flag

结论

想要彻底理解 launchMode,只要记住以下几点:

上一篇 下一篇

猜你喜欢

热点阅读