5

私のアクティビティの 1 つは、VideoViewいくつかのコンテンツを再生するために埋め込まれています。ビデオの一時停止/再開をそれぞれonPause()とに実装onResume()しましたが、驚いたことにonResume、アクティビティが実際にユーザーに表示される前に呼び出されます。

正確には、シナリオは次のとおりです。

  • アクティビティは画面上にあり、ビデオは再生中です
  • ユーザーが電源ボタンで電話をロックする
  • アクティビティがonPause()呼び出され、ビデオが停止します
  • ユーザーが電源ボタンを押す
  • ユーザーが画面のロックを解除する前に、アクティビティが onResume()呼び出されます (したがって、ビデオが再開されます) 。

Android 2.2、2.3、4.0でこの動作を確認しました。ロック画面が消えた直後にアクティビティが再描画する準備を整えるために、意図的にそのように行われていると思います。

アクティビティが実際にユーザーに表示される瞬間を検出するにはどうすればよいですか? 呼ばれるのを待ってみましたonWindowFocusChanged(true)が、うまくいっているようですが、完全に安全だとは思えません。

4

2 に答える 2

8

onWindowFocusChanged イベントと OnResume イベントを待つ必要があります。これは、Android 4.1 以降では発生しない、よく知られた問題です。詳細については、http://android-developers.blogspot.co.uk/2011/11/making-android-games-that-play-nice.html をご覧ください。

于 2012-08-22T13:46:47.170 に答える
0

一般的onResumeには十分なはずですが、特別なケースではonResume()、 ではなく、ユーザーが画面のロックを解除したときにビデオを再開する必要があると思います。

これを実現するには、BroadcastReceiverと呼ばれるインテントをリッスンする を作成し、ビデオIntent.ACTION_USER_PRESENTonReceive再開する必要があります。

Intent.ACTION_USER_PRESENT:
デバイスが起動した後にユーザーが存在する場合に送信されます (例: キーガードがなくなった場合)。
これは、システムによってのみ送信できる保護されたインテントです。

于 2012-08-22T10:37:28.883 に答える