一、简介
哪些情况下开启一个 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。
网友评论