我们如何保持画中画模式?

问题描述 投票:32回答:5

我们有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()(无论你传递给IntentstartActivity())。

android android-8.0-oreo android-picture-in-picture
5个回答
7
投票
  1. 将活动移到后面 activity.moveTaskToBack(false /* nonRoot */);
  2. 将活动恢复到前面 Intent startIntent = new Intent(PipActivity.this, PipActivity.class); startIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); activity.startActivity(startIntent);

2
投票

我不认为活动可以决定离开画中画模式。

来自Android O API preview doc

进入PIP模式的活动进入暂停状态,但仍保持启动状态。如果用户点击PIP活动,则系统显示用户与之交互的菜单;在PIP状态下,没有触摸事件到达活动。

该活动将由onPictureInPictureModeChanged()通知。


1
投票

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.
        ...
    }
}

0
投票

我找到了100%可靠的方法来做到这一点。

  1. 将清单中PIP活动的taskAffinity属性设置为“com.package.pip”。无论什么,它只是必须与您的包名称不同,这是默认的任务关联。这将导致它在完全独立的堆栈中启动,就好像它是另一个应用程序一样。
  2. 每当您想要退出PIP时,请从另一个活动中使用startActivity(new Intent(this, PipActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK))启动它。

我只是看看当应用程序的主要活动当前处于PIP模式时会发生什么,并且您从启动器启动它并认为我可以复制它,我确实可以。


0
投票

我有同样的问题:

  • MainActivity打开启用了PIP模式的VideoPlayerActivity
  • 按后退按钮进入PIP模式。
  • 再次按下后退按钮,直到我从MainActivity退出。
  • 按PIP窗口上的关闭(X)按钮。
  • 打开应用程序,它将打开VideoPlayerActivity

虽然以上解决方案都不适合我,但我发现听X按钮的唯一方法是覆盖onStop

当从PIP恢复活动时,调用onResumeonPictureInPictureModeChanged,当点击X按钮时,调用onStoponPictureInPictureModeChanged

因此,当finish()被称为时,我试图在onPictureInPictureModeChanged内部调用onStop

override fun onStop() {
    super.onStop()
    onStopCalled = true
}

override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean, newConfig: Configuration) {
        if (isInPictureInPictureMode) {
            // ...
        } else {
            if (onStopCalled) {
                finish()
            }
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.