1page.title=アクティビティの停止と再起動 2page.tags=アクティビティのライフサイクル 3helpoutsWidget=true 4 5trainingnavtop=true 6 7@jd:body 8 9<div id="tb-wrapper"> 10 <div id="tb"> 11 12 <h2>このレッスンでの学習内容</h2> 13 <ol> 14 <li><a href="#Stop">アクティビティを停止する</a></li> 15 <li><a href="#Start">アクティビティを開始/再起動する</a></li> 16 </ol> 17 18 <h2>関連ドキュメント</h2> 19 <ul> 20 <li><a href="{@docRoot}guide/components/activities.html">アクティビティ</a> 21 </li> 22 </ul> 23 24<h2>試してみる</h2> 25 26<div class="download-box"> 27 <a href="http://developer.android.com/shareables/training/ActivityLifecycle.zip" class="button">デモのダウンロード</a> 28 <p class="filename">ActivityLifecycle.zip</p> 29</div> 30 31 </div> 32</div> 33 34<p>アクティビティを適切に停止、再起動することは、アクティビティのライフサイクルにおいて重要なプロセスであり、これによりアプリが常に動作中であり、進捗中の作業が失われないことをユーザーが認識できるようになります。アクティビティを停止して再開させるシナリオの主な例を次に示します。 35 36</p> 37 38<ul> 39 <li>ユーザーが [最近使用したアプリ] ウィンドウを開き、現在のアプリから別のアプリに切り替えると、現在フォアグラウンドにあるアプリのアクティビティが停止します。 40ユーザーがホーム画面のランチャー アイコンまたは [最近使用したアプリ] ウィンドウから復帰した場合は、アクティビティは再起動します。 41</li> 42 <li>ユーザーが新しいアクティビティを開始するアプリ内のアクションを実行します。2 番目のアクティビティが作成されると現在のアクティビティが停止します。 43ユーザーが <em>[戻る]</em> ボタンを押すと、最初のアクティビティが再起動されます。 44</li> 45 <li>ユーザーが自分の携帯電話でアプリの使用中に電話を受けます。</li> 46</ul> 47 48<p>{@link android.app.Activity} クラスでは、{@link 49android.app.Activity#onStop()} と {@link android.app.Activity#onRestart()} の 2 つのライフサイクル メソッドが提供され、アクティビティの停止動作と再起動動作を明確に制御できます。 50UI が部分的に隠されることでわかる一時停止状態とは異なり、停止状態では必ず UI が完全に表示されなくなり、ユーザーのフォーカスが別のアクティビティ(または完全に別個のアプリ)に移ります。 51 52</p> 53 54<p class="note"><strong>注:</strong> {@link android.app.Activity}インスタンスは、停止中にシステム メモリ内に保持されるため、 55{@link android.app.Activity#onStop()} と {@link android.app.Activity#onRestart()} (さらに {@link 56android.app.Activity#onStart()})メソッドを実装する必要がない場合があります。 57比較的単純なほとんどのアクティビティの場合、アクティビティの停止と再起動が問題なく行われるため、現行のアクションを一時停止してシステム リソースから切り離すために {@link 58android.app.Activity#onPause()} を使用するだけでよい場合もあります。 59</p> 60 61<img src="{@docRoot}images/training/basics/basic-lifecycle-stopped.png" /> 62<p class="img-caption"><strong>図 1.</strong> ユーザーがアクティビティを離れたとき、システムは 63{@link android.app.Activity#onStop onStop()} を呼び出してアクティビティ(1)を停止します。アクティビティが停止している間にユーザーが復帰した場合、システムは {@link android.app.Activity#onRestart onRestart()} 64(2)を呼び出し、すぐに {@link android.app.Activity#onStart onStart()}(3)と {@link 65android.app.Activity#onResume()}(4)が続きます。 66アクティビティを停止させるシナリオによらず、システムは {@link 67android.app.Activity#onStop onStop()} を呼び出す前に、常に {@link android.app.Activity#onPause onPause()} を呼び出すことに注意してください。 68</p> 69 70 71 72<h2 id="Stop">アクティビティを停止する</h2> 73 74<p>アクティビティは {@link android.app.Activity#onStop()} メソッドの呼び出しを受信すると表示されなくなり、ユーザーが使用していない間は必要とされないほぼすべてのリソースが解放されます。 75 76アクティビティが停止すると、システムはそのメモリを取り戻す必要がある場合に、インスタンスを破棄することがあります。 77極端な場合には、システムは、アクティビティの最終段階に当たる {@link android.app.Activity#onDestroy()} コールバックを呼び出すことなく、アプリのプロセスを強制終了する場合があるため、 78{@link android.app.Activity#onStop()} を使用してメモリのリークを引き起こす可能性があるリソースを解放することが重要です。 79</p> 80 81<p>{@link android.app.Activity#onPause onPause()} メソッドが 82{@link android.app.Activity#onStop()} の前に呼び出されますが、データベースに情報を書き込むような、規模が大きく CPU に負荷がかかるシャットダウン操作を実行するためには {@link android.app.Activity#onStop onStop()}を使用する必要があります。 83 84</p> 85 86<p>永続ストレージに下書きのメモの内容を保存する {@link android.app.Activity#onStop onStop()} の実装の例を次に示します。 87</p> 88 89<!-- TODO: Find a better example for onStop, because this kind of thing should probably use a 90separate thread but that's too complicated to show here. --> 91<pre> 92@Override 93protected void onStop() { 94 super.onStop(); // Always call the superclass method first 95 96 // Save the note's current draft, because the activity is stopping 97 // and we want to be sure the current note progress isn't lost. 98 ContentValues values = new ContentValues(); 99 values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText()); 100 values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle()); 101 102 getContentResolver().update( 103 mUri, // The URI for the note to update. 104 values, // The map of column names and new values to apply to them. 105 null, // No SELECT criteria are used. 106 null // No WHERE columns are used. 107 ); 108} 109</pre> 110 111<p>アクティビティが停止すると、{@link android.app.Activity} オブジェクトはメモリに常駐し、アクティビティが再開したときに再び呼び出されます。 112再開状態に導くいずれかのコールバック メソッドの間に作成されたコンポーネントを再初期化する必要はありません。 113また、レイアウト内の各 {@link android.view.View} の現在の状態が追跡されます。そのため、ユーザーが {@link android.widget.EditText} ウィジェットにテキストを入力した場合、その内容が保持されるので、それを保存、復元する必要はありません。 114 115 116</p> 117 118<p class="note"><strong>注:</strong> アクティビティが停止している間にシステムにより破棄された場合でも、依然として {@link android.os.Bundle}(ひとまとまりのキー値のペア)の {@link android.view.View} オブジェクト({@link 119android.widget.EditText} のテキストなど)の状態を保持し、ユーザーがアクティビティの同じインスタンスに復帰した場合には、それらを復元します(次の<a href="recreating.html">レッスン</a>では、アクティビティが破棄され、再作成された場合に、その他の状態データを保存するために {@link android.os.Bundle} を使用する方法の詳細について説明します)。 120 121 122</p> 123 124 125 126<h2 id="Start">アクティビティを開始/再起動する</h2> 127 128<p>アクティビティが停止状態からフォアグラウンドに復帰したとき、 129{@link android.app.Activity#onRestart()} の呼び出しを受信します。システムはまた、アクティビティが表示されるたびに(再起動か新規に作成された場合かのいずれか) {@link 130android.app.Activity#onStart()} メソッドを呼び出します。 131ただし、{@link 132android.app.Activity#onRestart()} メソッドはアクティビティが停止状態から再開する場合にのみ呼び出されるため、アクティビティが以前に停止したが破壊されていない場合にのみ必要となる可能性がある、特別な復旧作業を実行するためにこれを使用できます。 133 134</p> 135 136<p>多くの場合、アプリがアクティビティの状態を復元するために {@link android.app.Activity#onRestart()} の使用が必要となることはないため、一般的な多くのアプリに適用されるこのメソッドに関するガイドラインはありません。 137 138ただし、{@link android.app.Activity#onStop()} メソッドは、基本的にアクティビティのすべてのリソースをクリーンアップするため、アクティビティが再起動した際には再インスタンス化する必要があります。 139 140また、アクティビティが新規に作成されたとき(アクティビティの既存のインスタンスがない場合)にも、インスタンス化する必要があります。 141このような理由から、{@link android.app.Activity#onStop()} メソッドへの対応として、通常は {@link android.app.Activity#onStart()} コールバック メソッドを使用する必要があります。なぜなら、アクティビティを作成したときと停止状態からアクティビティを再開したときの両方において、システムが {@link 142android.app.Activity#onStart()} を呼び出すからです。 143 144 145</p> 146 147<p>たとえば、ユーザーが復帰まで長時間アプリから離れている可能性があるため、 148{@link android.app.Activity#onStart()} メソッドは、必要なシステム機能が有効になっているかを確認する場合に有用です。 149</p> 150 151<pre> 152@Override 153protected void onStart() { 154 super.onStart(); // Always call the superclass method first 155 156 // The activity is either being restarted or started for the first time 157 // so this is where we should make sure that GPS is enabled 158 LocationManager locationManager = 159 (LocationManager) getSystemService(Context.LOCATION_SERVICE); 160 boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 161 162 if (!gpsEnabled) { 163 // Create a dialog here that requests the user to enable GPS, and use an intent 164 // with the android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS action 165 // to take the user to the Settings screen to enable GPS when they click "OK" 166 } 167} 168 169@Override 170protected void onRestart() { 171 super.onRestart(); // Always call the superclass method first 172 173 // Activity being restarted from stopped state 174} 175</pre> 176 177 178 179 180<p>システムがアクティビティを破棄する場合は、{@link android.app.Activity} に対して {@link android.app.Activity#onDestroy()} メソッドが呼び出されます。 181通常、{@link android.app.Activity#onStop()} を使用してリソースのほとんどを解放している可能性があるため、{@link 182android.app.Activity#onDestroy()} の呼び出しを受信する時点では、大抵のアプリでは必要な作業は少なくなっています。 183このメソッドは、メモリ リークにつながる可能性を持つリソースを一掃する最後のチャンスであるため、付加的なスレッドが破棄され、さらにメソッドのトレースのような長時間実行するその他のアクションも停止するようにする必要があります。 184 185 186</p> 187 188