Home&Back onPause onStopなどの実行手順

17716 ワード

ActivitiesはActivity stackによって管理されています.新しいActivityが起動すると、stackのtop位置にあり、現在実行されているActivityになります.前のActivityはstackに残っており、このActivityを呼び出す必要がある場合、stackのtop位置に戻って現在実行されているActivityになります.
 
   
1つのActivityには4つの基本状態があります.
   1. Active/running状態、Activityが現在の画面にある場合.
 
   2. paused状態、Activityがフォーカスを失ったがユーザーに対して依然として見える場合.すなわち、非フルスクリーンまたは透明なActivityがそのActivityの画面上にあり、現在の焦点となっている.一方pausedのActivityはalive状態であり、すべての状態とメンバー情報を保持してウィンドウマネージャに接続されているが、システムが極めて低いメモリの場合、このActivityを殺すことができる.
 
   3. stopped状態、Activityが完全に別のActivityによって上書きされた場合.すべてのステータスとメンバー情報が保持されます.しかし、ユーザーには表示されないため、ウィンドウが非表示になり、他の場所でメモリが必要な場合、システムはこのActivityを殺すことがよくあります.
 
   4. Activityがpausedまたはstopped状態の場合、システムは、(finish()メソッドを呼び出す)プロセスを終了するか、直接殺すかを要求することによってメモリを駆除することができます.再びユーザーに表示されると、完全に再起動して以前の状態に戻るしかありません.
注意すべきは、
onPause(),onStop(),onDestory()の3つの方法は,システムによって直接killされることができる.
ああ、システムのメモリが不足しているとき.
一方、通常、1つのactivityから別のactivityに移行/復帰すると、新しいactivityがfull screen(AlertDialogなどのポップアップウィンドウは計算されない)である場合、callの前のactivityのonPause()が、onPauseまたはonStopにかかわらずkillになる可能性があるため、onPauseではsavedata操作を実行してすべての持続性データ(ユーザーの編集結果など)をストレージに書き込むのが一般的である.
 
2つのactivityが同じプロセス内で呼び出された場合を見てみましょう.
   
1.現在のactivityのonPause()メソッドを呼び出します.
   
2.次に、activityを新規に起動するonCreate()メソッド、onStart()メソッド、およびonResume()メソッドを呼び出します.
   
3.その後、起動したactivityが画面に表示されなくなった場合、そのonStop()メソッドが呼び出されます.
 
以下では、Logcatで記録したActivity呼び出し中のメソッド呼び出し順序を使用します.
  1. ボタンをクリックしてActivity 1を起動すると、

  
  
  
  
  1. 05-08 09:39:48.389: DEBUG/Activity1(313): onCreate   Activity 1 
  2. 05-08 09:39:48.399: DEBUG/Activity1(313): onStart    Activity 1 
  3. 05-08 09:39:48.399: DEBUG/Activity1(313): onResume   Activity 1 

これは一般的なActivityの起動順序が
onCreate -> onStart -> onResume
 
  2. back戻るキーをクリックすると

  
  
  
  
  1. 05-08 09:40:04.129: DEBUG/Activity1(313): onPause    Activity 1 
  2. 05-08 09:40:04.628: DEBUG/Activity1(313): onStop     Activity 1 
  3. 05-08 09:40:04.659: DEBUG/Activity1(313): onDestory  Activity 1 

  
現在のActivityを終了すると、onPause->onStop->onDestory
 
  3. Activityの再起動

  
  
  
  
  1. 05-08 09:40:18.249: DEBUG/Activity1(313): onCreate   Activity 1 
  2. 05-08 09:40:18.249: DEBUG/Activity1(313): onStart    Activity 1 
  3. 05-08 09:40:18.259: DEBUG/Activity1(313): onResume   Activity 1 

通常の起動手順と同じです
 
  4. Activity 1からActivity 2を起動

  
  
  
  
  1. 05-08 09:40:25.477: DEBUG/Activity1(313): onPause    Activity 1 
  2. 05-08 09:40:25.687: DEBUG/Activity2(313): onCreate   Activity 2 
  3. 05-08 09:40:25.687: DEBUG/Activity2(313): onStart    Activity 2 
  4. 05-08 09:40:25.719: DEBUG/Activity2(313): onResume   Activity 2 
  5. 05-08 09:40:26.277: DEBUG/Activity1(313): onStop     Activity 1 

   
Activity1.onPause -> Activity2.onCreate -> Activity2.onStart -> Activity2.onResume ->Activity1.onStop
 
  5. ホームボタンをクリックしてデスクトップに戻る

  
  
  
  
  1. 05-08 09:40:31.777: DEBUG/Activity2(313): onPause    Activity 2 
  2. 05-08 09:40:32.658: DEBUG/Activity2(313): onStop     Activity 2 

  
Activity2.onPause -> Activity2.onStop
 
  6. 元のプログラムに戻る

  
  
  
  
  1. 05-08 09:40:50.429: INFO/ActivityManager(58): Starting activity: Intent ... 
  2. 05-08 09:40:50.649: DEBUG/Activity2(313): onRestart  Activity 2 
  3. 05-08 09:40:50.649: DEBUG/Activity2(313): onStart    Activity 2 
  4. 05-08 09:40:50.769: DEBUG/Activity2(313): onResume   Activity 2 

  
Activity2.onRestart -> Activity2.onStart -> Activity2.onResume
 
  7. comfirmをクリックし、setResult(RESULT_OK)、Activity 2.finish()、Activity 1に戻る

  
  
  
  
  1. 05-08 09:41:04.928: DEBUG/Activity2(313): onPause    Activity 2 
  2. 05-08 09:41:04.988: DEBUG/Activity1(313): onRestart  Activity 1 
  3. 05-08 09:41:04.998: DEBUG/Activity1(313): onStart    Activity 1 
  4. 05-08 09:41:04.998: DEBUG/Activity1(313): onResume   Activity 1 
  5. 05-08 09:41:05.419: DEBUG/Activity2(313): onStop     Activity 2 
  6. 05-08 09:41:05.469: DEBUG/Activity2(313): onDestory  Activity 2 

  
Activity2.onPause -> Activity1.onRestart -> Activity1.onStart -> Activity1.onResume -> Activity2.onStop
 
   8. back戻るキーをクリックすると

  
  
  
  
  1. 05-08 09:41:51.868: DEBUG/Activity1(313): onPause    Activity 1 
  2. 05-08 09:41:52.428: DEBUG/Activity1(313): onStop     Activity 1 
  3. 05-08 09:41:52.468: DEBUG/Activity1(313): onDestory  Activity 1 

Activity 1終了:
onPause -> onStop -> onDestory
 
Activityステータスの保存
Activity状態を保存するのは,ユーザがプログラムを再開したときに,前回離れたときの状態に戻るのを容易にするためである.この方法は次のとおりです.
   
protected void onSaveInstanceState (Bundle outState)
   protected void onRestoreInstanceState (Bundle savedInstanceState)
Activityがkillされる前に、onSaveInstanceState()を呼び出して現在のactivityのステータス情報を保存できます.これにより、activityの動的ステータスが名前と値のペアで記録されます.
Bundleオブジェクトはこのメソッドに渡されます.Activityが再起動されると、このBundleはonCreate()メソッドとonStart()メソッドに従って呼び出されたonRestoreInstanceState()に渡されます.この2つの方法の内容は、一時的に保存するデータをBundleに入れるか、中から取り出すのが一般的です.
なお、onSaveInstanceState()とonRestoreInstanceState()はライフサイクルメソッドではありません.常に呼び出されるわけではありません.たとえば、Androidはactivityがシステムによって破棄されやすい前にonSaveInstanceState()を呼び出すが、ユーザの動作(例えばBACKキーが押された)による破棄は呼び出さない.この場合,ユーザは再びこのactivityに戻るつもりはないので,状態を保存する必要はない.onSaveInstanceState()は常に呼び出されるわけではないので、activityの一時的な状態を保存するために使用する必要があります.永続性データを保存するためには使用できません.
この目的を達成するには、onPause()でカスタムネーミングの関数saveState()を呼び出し、saveStateでデータベースにデータを保存する必要があります.