如何在Android PIP模式下获得活动结果?
我注意到,当一个活动在Android中处于画中画(PIP)模式时,它似乎没有收到通过如何在Android PIP模式下获得活动结果?,android,onactivityresult,Android,Onactivityresult,我注意到,当一个活动在Android中处于画中画(PIP)模式时,它似乎没有收到通过startActivityForResult(…)请求的结果。除非我做错了什么?我编写了一个简单的示例应用程序,它进入PIP模式,然后启动一个result活动,调用setResult(…)和finish,所以我不认为我会把这搞砸 我假设这个bug可能是在PIP模式下运行的活动在活动生命周期中的差异造成的意外副作用;它们似乎大部分时间处于“已启动但已暂停”状态,而不是恢复 也许有人有办法以其他方式得到结果?虽然我猜
startActivityForResult(…)
请求的结果。除非我做错了什么?我编写了一个简单的示例应用程序,它进入PIP模式,然后启动一个result活动,调用setResult(…)
和finish
,所以我不认为我会把这搞砸
我假设这个bug可能是在PIP模式下运行的活动在活动生命周期中的差异造成的意外副作用;它们似乎大部分时间处于“已启动但已暂停”状态,而不是恢复
也许有人有办法以其他方式得到结果?虽然我猜反射是不可能的,因为Android P限制了非SDK接口。似乎我们能做的最好的事情是发明另一种机制来发送结果,它使用广播,但这不适用于内置的现有活动,例如从意图获取结果。操作获取内容在这篇文章之后,我们覆盖了活动方法finish()
要检查PIP模式何时启动,如果是,我们先导航到launcher活动,然后再调用super类方法,使活动结果逻辑工作
这是导航到启动器活动的代码
override fun finish() {
if (pictureInPictureLaunched) navToLauncherTask()
super.finish()
}
fun navToLauncherTask() {
val activityManager = baseContext.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
// iterate app tasks available and navigate to launcher task (browse task)
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
}
}
}
在这篇文章之后,我们重写Activity方法finish()
,以检查何时启动了PIP模式,如果是,则在调用活动结果逻辑的超类方法之前导航到启动器活动
这是导航到启动器活动的代码
override fun finish() {
if (pictureInPictureLaunched) navToLauncherTask()
super.finish()
}
fun navToLauncherTask() {
val activityManager = baseContext.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
// iterate app tasks available and navigate to launcher task (browse task)
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模式时,它将被放入带有标志的新任务中。
根据官方文件,此标志不允许我们请求调用方活动的结果
当调用方请求正在启动的活动的结果时,不能使用此标志
为了解决这个问题,也许我们可以使用其他库,比如发送activity finish()事件和数据。我想这是因为当activity进入PIP模式时,它将被放入带有标志的新任务中。
根据官方文件,此标志不允许我们请求调用方活动的结果
当调用方请求正在启动的活动的结果时,不能使用此标志
为了解决这个问题,也许我们可以使用其他库,比如发送activity finish()事件和数据。你明白了吗?没有,但我想知道多简历是否适用于PIP,在这种情况下,问题可能会在较新的平台上消失,请看你明白了吗?没有,但我很好奇多重恢复是否适用于PIP,在这种情况下,问题可能会在较新的平台上消失,因为我实际上是指我的活动A在PIP模式下运行,我启动了另一个活动B以获得结果。当我开始活动B时,我没有使用NEW_任务标志。啊,很抱歉误解了你的问题,请忽略此答案。我的意思是我的活动A正在PIP模式下运行,我又开始了另一个活动B以获得结果。当我开始活动B时,我没有使用新的任务标志。啊,很抱歉误解了你的问题,请忽略此答案。