我有三个活动A, B, C。正如预期的那样,当C被更改为pip (picture in picture)模式时,它作为一个新任务被分离出来。当在Activity C上按下back pressed时,它将完成,用户将被发送到android系统主屏幕。我希望用户从活动C被调用的地方转移到活动;包括该任务的整个后栈。
经验可以这样理解:
Task1:→B→C
用户按下home键,c切换到PIP模式
任务1:A->B
任务2:C
现在C被发送到全屏并按下返回键。
任务1:A->B
任务2:
用户已被发送到android主界面。我希望用户被转移到活动b。基本上,这意味着,在另一个任务(Task2)的当前活动结束后,我希望访问前一个正在运行的任务(Task1)。
在清单中,将ActivityB作为父活动添加到C
AndroidManifest.xml
<application ....>
<activity android:name="package.ActivityB"/>
<activity android:name="package.ActivityC"
android:parentActivityName="package.ActivityB"/>
</application>
基本上,这需要通过执行两个变通方法来处理。
- 声明活动C (pip活动)为
android:launchMode="singleInstance"
,并为其定义一个任务关联:android:taskAffinity=":pip"
。 - 当Activity C完成()时,调用这个函数:
fun navToMainTask(appContext: Context){
val activityManager =
(appContext.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager)
val appTasks = activityManager.appTasks
for (task in appTasks) {
val baseIntent = task.taskInfo.baseIntent
val categories = baseIntent.categories
if (categories != null && categories.contains(Intent.CATEGORY_LAUNCHER)) {
task.moveToFront()
return
}
}
}
通过分配任务亲和性,我们要求pip活动在应用程序的进程中启动。因此,activityManager.appTasks
将返回两个任务:
a) Task1: a ->B
b) Task2: C
由于活动A是启动应用程序的主活动,所以它应该被归类为"启动器"。
for循环将检查应用程序的所有任务,并将具有启动器活动的任务带到前面。
因此,当Activity C被销毁时,Task1将被移到前面,Activity B将对用户可见。