我们enterPictureInPictureMode()
将活动从当前表单移动到画中画表示。
除了破坏活动之外,我们还原的方法是什么,将活动恢复到正常状态? exitPictureInPictureMode()
上没有leavePictureInPictureMode()
,janeGetMeOffThisCrazyPictureInPictureModeThing()
或Activity
方法,文档似乎没有涵盖替代方案。
我对Android O的解决方案感兴趣,对于移动设备上的画中画模式,虽然这对Android TV也有效,太棒了!
UPDATE 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
的{{1}}是什么。)
答案 0 :(得分:7)
将活动移至后面
activity.moveTaskToBack(false /* nonRoot */);
将活动恢复到前面
Intent startIntent = new Intent(PipActivity.this, PipActivity.class);
startIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
activity.startActivity(startIntent);
答案 1 :(得分:2)
我不认为活动可以决定离开画中画模式。
进入PIP模式的活动进入暂停状态,但仍保持启动状态。如果用户点击PIP活动,则系统显示用户与之交互的菜单;在PIP状态下,没有触摸事件到达活动。
答案 2 :(得分:1)
Official documentation说PIP窗口会显示菜单,让您切换到全屏。
PIP窗口为240x135 dp,显示在最顶层的一层中 屏幕的四个角,由系统选择。用户可以 打开一个 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.
...
}
}
答案 3 :(得分:0)
我找到了一种100%可靠的方法来实现这一目标。
taskAffinity
属性设置为“ com.package.pip”之类的内容。没关系,它必须与您的程序包名称不同,后者是默认的任务关联。这将导致它在完全独立的堆栈中启动,就好像它完全是另一个应用程序一样。startActivity(new Intent(this, PipActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK))
启动它。我只是查看了当应用程序的主要活动当前处于PIP模式并且您从启动器启动它时会发生什么,并认为我可以复制它,并且确实可以。
答案 4 :(得分:0)
我遇到了同样的问题:
MainActivity
打开VideoPlayerActivity
,其中已启用PIP模式。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()
}
}
}