/ /親のアクティビティは通常ロック時に停止しますが、方向の変更後は停止しません-Android

親アクティビティは通常、ロック時に停止しますが、方向変更後は停止しません - アンドロイド

2つのアクティビティを備えたデモアプリがあります。 アプリの起動時に親が起動し、親のボタンを介して子が起動します。子は透明な背景で設定されているため、子が起動しても親は停止しません。

親を起動するアプリを起動してから、子を起動します。次に、デバイスをロックします。子がonStop()を呼び出し、次に親がonStop()を呼び出していることがわかります。

ただし、アプリをロックする代わりに、方向の変更をトリガーするデバイス。アプリをロックすると、ChildのみがonStop()を呼び出します。アプリのロックを解除し、戻るボタンを押すと、ChildとParentの両方がonStop()を呼び出します。そのため、Parentアクティビティはこの奇妙な状態にあり、「表示されません」がonStop()を呼び出していません。

  1. なんでこんなことが起こっているの?
  2. デバイスがロックされているときにonStop()を呼び出すようにするにはどうすればよいですか?

私が見ている問題を示すために、単純なAndroidプロジェクトを作成しました。

https://github.com/skykelsey/Rotation

回答:

回答№1は1

Nexus 5(Android 5.0.1)でこれが得られるのは、私が launch the app -> start ChildActivity -> rotate the device -> lock the device -> unlock the device

E/ROTATION﹕ ParentActivity.onStart()
E/ROTATION﹕ Orientation: portrait
E/ROTATION﹕ ChildActivity.onStart()
E/ROTATION﹕ Orientation: portrait
E/ROTATION﹕ ChildActivity.onStop()
E/ROTATION﹕ ChildActivity.onStart()
E/ROTATION﹕ Orientation: landscape
E/ROTATION﹕ ParentActivity.onStop()
E/ROTATION﹕ ParentActivity.onStart()
E/ROTATION﹕ Orientation: landscape
E/ROTATION﹕ ChildActivity.onStop()
E/ROTATION﹕ ChildActivity.onStart()
E/ROTATION﹕ Orientation: portrait
E/ROTATION﹕ ParentActivity.onStop()
E/ROTATION﹕ ParentActivity.onStart()
E/ROTATION﹕ Orientation: portrait
E/ROTATION﹕ ChildActivity.onStop()
E/ROTATION﹕ ChildActivity.onStart()
E/ROTATION﹕ Orientation: landscape
E/ROTATION﹕ ParentActivity.onStop()
E/ROTATION﹕ ParentActivity.onStart()
E/ROTATION﹕ Orientation: landscape

つまり、説明した問題を再現できません。実際、表示されない場合は正常です onStop() 呼び出されることが保証されていない場合があります。

保護されたボイド onStop ()

onPause()メソッドが呼び出された後にアクティビティのプロセスを実行し続けるための十分なメモリがシステムにない低メモリ状況では、このメソッドは決して呼び出されないことに注意してください。

また、そのページで提供されているアクティビティライフサイクルテーブルを参照してください。

アクティビティライフサイクルテーブル

ハイライトされたテキストは

上記の表の「Kill​​able」列に注意してください-強制終了可能としてマークされたメソッドの場合、そのメソッドが返された後、アクティビティをホストするプロセスは、コードの別の行が実行されることなく、いつでもシステムによって強制終了されます。 このため、onPause()メソッドを使用して、永続的なデータ(ユーザー編集など)をストレージに書き込む必要があります。.

つまり、実行している操作が重要な場合は、使用する必要があります onPause() のではなく、 onStop().

お役に立てれば。