打印acitivity任务栈信息:adb shell dumpsys activity activities
打印正在运行的信息:adb shell dumpsys activity activities | sed -En -e '/Running activities/,/Run #0/p'
singleTask 不指定android:taskAffinity不会产生新的任务栈,并且被再次调用的时候回清除其上面的activity
singleInstance模式会产生一个新的栈并且Activity只有他自己,在它上面打开新的界面,会调起原来的任务栈打开新界面,并且原来的task后返回的话也要等待原来的都返回才能在回到singleInstance的Activity。
1.Intent.FLAG_ACTIVITY_CLEAR_TASK 要配合Intent.FLAG_ACTIVITY_NEW_TASK使用 清除栈放自己
val intent = Intent(applicationContext, ModeStandardActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK
startActivity(intent)
2.Intent.FLAG_ACTIVITY_CLEAR_TOP 清除其顶层的activity
3.android:taskAffinity="com.huo.taskSelf" 指定任务栈名字,置默认是包名
格式是xxx.xxx.xxx 直接写xxx会报错
The application could not be installed: INSTALL_FAILED_USER_RESTRICTED
可以设置在清单文件application 和 activity标签,application控制所有的activity,activity控制自己,如果不设置默认是包名。
android:taskAffinity="com.huo.taskSelf" 可以用来生成新的任务栈
效果:在历史活动中会有两个活动一个是默认的,一个是指定名字的taskAffinity
android:taskAffinity="com.huo.taskSelf" 生成新的任务栈,并且历史活动会看到两个activity
必要条件缺一不可:
- 清单文件activity标签配置android:taskAffinity名字不同
-
开启activity模式Intent.FLAG_ACTIVITY_NEW_TASK or singleInstance or singleTask
singleInstance:好理解本来就生成新的任务栈再加上名字满足条件
singleTask:等同于提供了Intent.FLAG_ACTIVITY_NEW_TASK
注意:如果打开了新的任务栈后点击返回可以回到上一个任务栈,但是如果回到桌面在点开各自的历史活动只会打开自己的。
还有一种情况通过隐式意图跨应用调用,这个默认就实现了名字的不同,只要指定Intent.FLAG_ACTIVITY_NEW_TASK,就一定开启的两个task,不指定的话会在调用者的任务栈添加被调用的activity
<intent-filter>
<action android:name="com.huo.task.activity"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>