Android-taskAffinity

2020-11-28  本文已影响0人  有腹肌的豌豆Z

一、简介

哪些情况下开启一个 Activity 会在新的 task 运行,哪些情况下会继续在原来的task 运行。

activity.getTaskId()

每个 Activity 运行时都有一个其归属的 task栈,我们可以用 activity.getTaskId() 的方法得到当前 activity 的taskId。如果两个 activity 的 taskId 不同,则他们肯定不会属于同一个 task。

public class MyApplication extends Application {
    private static final String  TAG_APP = MyApplication.class.getSimpleName();
    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG_APP,"MyApplication#onCreate"+Thread.currentThread().getName();
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            //已过滤无用代码,只在onresume 读取相关数据
            @Override
            public void onActivityResumed(Activity activity) {
                Log.d(TAG_APP,"onActivityResumed+"+activity.getClass().getSimpleName()+"####taskid = "+activity.getTaskId());
            }
        });

    }
}

taskAffinity 的使用方式如下

如上图所示,taskaffinity 可以单独对一个 activity 使用,代表该 activity 所想归属的 task;
也能对application 使用,代表该 application 内声明的所有 activity 都归属于这个task。

如果 activity 组件没有声明 taskAffinity 的话,该 activity 的 taskAffinity 属性也是有默认值的。如果 application 指定了 taskAffinity 值,默认值就是 application 指定的 taskAffinity 值;如果 application 未指定的话,默认值就是 manifest 中声明的包名(package 对应的字符串)。

任务列表

Android 手机的任务列表就是根据不同 task 弹出的,我们可以根据任务管理器有几个 item 图标,来知道我们开启了几个 task。

是否开启新的Task

是不是我指定了一个 Activity 的 taskAffinity 值(跟包名不同),运行该 Activity 时,是否就会新开这个 task栈呢?

答案是否定的,一个 Activity 运行时所归属的task,默认是启动它 的那个Activity 所在的 task(下文将会验证)。

taskAffinity生效

taskAffinity 单独使用并不会生效。
要想其生效,需要配合其他属性使用,或者配合 Intent.FLAG_ACTIVITY_NEW_TASK,或者配合
allowTaskReparenting 。使用时用其中的一个就行,下面将详细介绍这两个属性。

二、启动新的Task

Intent.FLAG_ACTIVITY_NEW_TASK

Intent.FLAG_ACTIVITY_NEW_TASK 使用方式如下,

Intent intent = new Intent(this,IntentTimeActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

当 AMS 发现启动了一个带有 FLAG_ACTIVITY_NEW_TASK 标签的 Activity 时,会先去寻找当前是否存在这个 Activity 的 task 值(这个值具体是什么可看 知识点2),如果不存在的话,就会创建该task,如果存在就省去了创建 task 这个步骤。然后在把要启动的 Activity 添加到 task 中。

AMS 分配的taskid 是线性递增的,每次开启一个新的task ,taskid 永远都是 +1 的操作。

android:launchMode="singleTask"

 <activity
            android:name=".MainActivity2"
            android:launchMode="singleTask"
            android:taskAffinity="com.example.taskaffinity.newtask" />

allowTaskReparenting 相关

llowTaskReparenting 这个属性指的是一个 Activity 运行时,可以重新选择自己所属的task。基本是在跨app 间调用时。

// 将 allowTaskReparenting 设置为 true
<activity android:name=".Main2Activity"
            android:allowTaskReparenting="true"> 
            <intent-filter>
                <action android:name="xxx.xxx.xxx"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>

若 Activity taskAffinity指定的task 已经存在,是会复用之前的task,而不会再重新创建一个新的task。

上一篇下一篇

猜你喜欢

热点阅读