美文网首页
Android-taskAffinity

Android-taskAffinity

作者: 有腹肌的豌豆Z | 来源:发表于2020-11-28 09:38 被阅读0次

    一、简介

    哪些情况下开启一个 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。

    相关文章

      网友评论

          本文标题:Android-taskAffinity

          本文链接:https://www.haomeiwen.com/subject/gmxfwktx.html