41

我们必须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()or onStart(),但确实会触发onNewIntent()(无论Intent您传递给startActivity())。

4

5 回答 5

14
  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);
    
于 2017-04-07T23:35:10.920 回答
10

我有同样的问题:

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

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

当活动从 PIP 恢复onResume并被onPictureInPictureModeChanged调用时,当X单击按钮时,onStop并被onPictureInPictureModeChanged调用。

因此,当已经调用时,我尝试在finish()内部调用。onPictureInPictureModeChangedonStop

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

override fun onResume() {
    super.onResume()
    onStopCalled = false
}

override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean, newConfig: Configuration) {
        if (isInPictureInPictureMode) {
            // ...
        } else {
            if (onStopCalled) {
                finish()
            }
        }
    }
于 2019-05-14T09:59:12.153 回答
3

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

来自Android O API 预览文档

进入 PIP 模式的活动进入暂停状态,但仍保持启动状态。如果用户点击 PIP 活动,系统会显示一个菜单供用户交互;活动处于 PIP 状态时,没有触摸事件到达活动。

活动将由 通知onPictureInPictureModeChanged()

于 2017-04-07T17:40:16.573 回答
0

官方文档说 PIP 窗口带有菜单,可让您切换到全屏。

PIP 窗口为 240x135 dp,显示在屏幕四个角之一的最顶层,由系统选择。用户可以通过按住遥控器上的主页按钮调出PIP 菜单,让他们将 PIP 窗口切换为全屏,或关闭 PIP 窗口。如果另一个视频开始在主屏幕上播放,PIP 窗口将自动关闭。

当用户切换 PIP 模式时,您可以覆盖 PIP 更改事件来处理 UI 元素。

链接到 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.
        ...
    }
}
于 2017-04-02T23:50:40.907 回答
0

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

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

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

于 2019-04-25T18:08:29.740 回答