我们有enterPictureInPictureMode()
将活动从其当前形式转移到画中画表示。
除了破坏活动之外,我们还原的方法是什么,将活动恢复到正常状态?在exitPictureInPictureMode()
上没有leavePictureInPictureMode()
,janeGetMeOffThisCrazyPictureInPictureModeThing()
或Activity
方法,文档似乎没有涵盖替代方案。
我对Android O的解决方案感兴趣,对于移动设备上的画中画模式,虽然如果它也适用于Android TV,太棒了!
更新2017-04-08:如果您想要的是当用户单击X按钮退出画中画模式时返回正常模式,您可以执行以下操作:
@Override
public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
super.onPictureInPictureModeChanged(isInPictureInPictureMode);
if (!isInPictureInPictureMode) {
getApplication().startActivity(new Intent(this, getClass())
.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT));
}
}
关键位是调用startActivity()
以使用FLAG_ACTIVITY_REORDER_TO_FRONT
再次启动当前活动。有了singleTask
活动,你需要在一些非Activity
语境中调用它,例如Application
单例。这似乎没有触发onStop()
或onStart()
,但它确实触发onNewIntent()
(无论你传递给Intent
的startActivity()
)。
activity.moveTaskToBack(false /* nonRoot */);
Intent startIntent = new Intent(PipActivity.this, PipActivity.class);
startIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
activity.startActivity(startIntent);
我不认为活动可以决定离开画中画模式。
进入PIP模式的活动进入暂停状态,但仍保持启动状态。如果用户点击PIP活动,则系统显示用户与之交互的菜单;在PIP状态下,没有触摸事件到达活动。
该活动将由onPictureInPictureModeChanged()
通知。
Official documentation说PIP窗口会出现菜单,让你切换到全屏。
PIP窗口为240x135 dp,显示在屏幕四个角之一的最顶层,由系统选择。用户可以通过按住遥控器上的Home按钮调出PIP菜单,让PIP窗口切换到全屏,或关闭PIP窗口。如果另一个视频开始在主屏幕上播放,PIP窗口将自动关闭。
并且只要用户切换PIP模式,您就可以覆盖PIP更改事件以处理UI元素。
link to onPictureInPictureModeChanged
@Override
public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
if (isInPictureInPictureMode) {
// Hide the controls in picture-in-picture mode.
...
} else {
// Restore the playback UI based on the playback status.
...
}
}
我找到了100%可靠的方法来做到这一点。
taskAffinity
属性设置为“com.package.pip”。无论什么,它只是必须与您的包名称不同,这是默认的任务关联。这将导致它在完全独立的堆栈中启动,就好像它是另一个应用程序一样。startActivity(new Intent(this, PipActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK))
启动它。我只是看看当应用程序的主要活动当前处于PIP模式时会发生什么,并且您从启动器启动它并认为我可以复制它,我确实可以。
我有同样的问题:
MainActivity
打开启用了PIP模式的VideoPlayerActivity
。MainActivity
退出。X
)按钮。VideoPlayerActivity
。虽然以上解决方案都不适合我,但我发现听X
按钮的唯一方法是覆盖onStop
。
当从PIP恢复活动时,调用onResume
和onPictureInPictureModeChanged
,当点击X
按钮时,调用onStop
和onPictureInPictureModeChanged
。
因此,当finish()
被称为时,我试图在onPictureInPictureModeChanged
内部调用onStop
。
override fun onStop() {
super.onStop()
onStopCalled = true
}
override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean, newConfig: Configuration) {
if (isInPictureInPictureMode) {
// ...
} else {
if (onStopCalled) {
finish()
}
}
}