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

时间:2017-04-02 23:07:20

标签: android android-8.0-oreo android-picture-in-picture

我们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}}是什么。)

5 个答案:

答案 0 :(得分: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);
    

答案 1 :(得分:2)

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

来自Android O API preview doc

  

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

活动将由onPictureInPictureModeChanged()通知。

答案 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%可靠的方法来实现这一目标。

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

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

答案 4 :(得分:0)

我遇到了同样的问题:

  • MainActivity打开VideoPlayerActivity,其中已启用PIP模式。
  • 按返回按钮进入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()
            }
        }
    }
相关问题