アクティビティを現在のフォームからピクチャーインピクチャー表現に移動するenterPictureInPictureMode()
があります。
それを元に戻して、アクティビティを破壊する以外に、アクティビティを通常の状態に戻す手段は何ですか? Activity
にはexitPictureInPictureMode()
、leavePictureInPictureMode()
、janeGetMeOffThisCrazyPictureInPictureModeThing()
の各メソッドはありません。また、ドキュメントには代替方法が記載されていないようです。
Android O、モバイルデバイスでのピクチャインピクチャモードのソリューションに興味がありますが、それがAndroidテレビでも素晴らしい!
PDATE 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));
}
}
重要なのは、FLAG_ACTIVITY_REORDER_TO_FRONT
で現在のアクティビティを再開するためにstartActivity()
を呼び出すことです。 singleTask
アクティビティでは、Activity
シングルトンなど、Application
以外のコンテキストでそれを呼び出す必要があります。これはonStop()
またはonStart()
をトリガーするようには見えませんが、onNewIntent()
をトリガーします(startActivity()
に渡すIntent
は何でも)。
アクティビティを後ろに移動します
activity.moveTaskToBack(false /* nonRoot */);
アクティビティを前面に戻す
Intent startIntent = new Intent(PipActivity.this, PipActivity.class);
startIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
activity.startActivity(startIntent);
アクティビティがPicture-in-Pictureモードを終了することを決定できるとは思わない。
PIPモードに入るアクティビティは一時停止状態になりますが、開始されたままです。ユーザーがPIPアクティビティをタップすると、システムはユーザーが操作するためのメニューを表示します。 PIP状態にある間、タッチイベントはアクティビティに到達しません。
アクティビティは onPictureInPictureModeChanged()
で通知されます。
公式ドキュメント は、PIPウィンドウにメニューが表示され、フルスクリーンに切り替えることができると言います。
PIPウィンドウは240x135 dpであり、システムによって選択された画面の4つのコーナーのいずれかの最上層に表示されます。ユーザーは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.
...
}
}
これを行うための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
と呼ばれます。
そこで、onPictureInPictureModeChanged
が呼び出されたときにonStop
内でfinish()
を呼び出そうとしました。
override fun onStop() {
super.onStop()
onStopCalled = true
}
override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean, newConfig: Configuration) {
if (isInPictureInPictureMode) {
// ...
} else {
if (onStopCalled) {
finish()
}
}
}