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="#Pause">アクティビティを一時停止する</a></li> 15 <li><a href="#Resume">アクティビティを再開する</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>通常のアプリの使用中、フォアグラウンドのアクティビティは、他のビジュアル コンポーネントによって隠される場合があり、これによりアクティビティが<em>一時停止</em>します。 35たとえば、半透明のアクティビティが開くと(ダイアログのスタイルなど)、以前のアクティビティは一時停止します。 36そのアクティビティは、まだ部分的に表示されていても、現在フォーカスされているアクティビティではない状態である限り、一時停止状態が維持されます。 37</p> 38 39<p>ただし、アクティビティが完全に隠され、表示されなくなった場合は、<em>停止</em>します(これについては次のレッスンで説明します)。 40</p> 41 42<p>アクティビティが一時停止状態に入ると、一時停止中は継続させない方が望ましい進行中のアクション(ビデオなど)を停止させたり、ユーザーがアプリを離れたままになった場合に備えて保存する必要のある情報すべてを保持したりできるよう、システムは {@link android.app.Activity} 上で {@link 43android.app.Activity#onPause onPause()} メソッドを呼び出します。ユーザーが一時停止状態からアクティビティに復帰した場合は、システムはアクティビティを再開し、{@link android.app.Activity#onResume onResume()} メソッドを呼び出します。 44 45 46 47</p> 48 49<p class="note"><strong>注:</strong> アクティビティが {@link 50android.app.Activity#onPause()} の呼び出しを受信した場合は、アクティビティが一瞬一時停止された後、ユーザーが同アクティビティにフォーカスを戻す可能性があることを示している場合があります。 51ただし、通常は、ユーザーがアクティビティを離れていることを最初に示すものです。 52</p> 53 54<img src="{@docRoot}images/training/basics/basic-lifecycle-paused.png" /> 55<p class="img-caption"><strong>図 1.</strong>半透明のアクティビティによって自分のアクティビティが隠されると、システムは {@link android.app.Activity#onPause onPause()} を呼び出し、アクティビティは一時停止の状態で待機します(1)。 56 57一時停止中にユーザーがアクティビティに復帰した場合、システムは {@link android.app.Activity#onResume onResume()} を呼び出します(2)。 58</p> 59 60 61<h2 id="Pause">アクティビティを一時停止する</h2> 62 63<p>システムがアクティビティに対して {@link android.app.Activity#onPause()} を呼び出した場合、技術的にはアクティビティはまだ部分的に表示されていることを意味しますが、ほとんどの場合は、ユーザーがアクティビティを離れていて、ほどなく停止状態になる徴候を示しています。 64 65通常、以下を行う場合には、{@link android.app.Activity#onPause()} コールバックを使用する必要があります。 66</p> 67 68<ul> 69 <li>CPU を消費する可能性があるアニメーションや他の進行中のアクションを停止する。</li> 70 <li>ユーザーがアクティビティを離れた場合にも変更が永続的に保存されると期待するような場合(メールの下書きなど)でのみ、未保存の変更をコミットする。 71</li> 72 <li>放送用レシーバーなどのシステム リソース、(GPS 73などの)センサー処理や、アクティビティが一時停止され、ユーザーが必要としない間にバッテリー寿命に影響を与える可能性があるすべてのリソースを解放する。 74</li> 75</ul> 76 77<p>たとえば、アプリケーションが {@link android.hardware.Camera} を使用する場合、{@link android.app.Activity#onPause()} メソッドは、リソースの解放に適した手段です。 78</p> 79 80<pre> 81@Override 82public void onPause() { 83 super.onPause(); // Always call the superclass method first 84 85 // Release the Camera because we don't need it when paused 86 // and other activities might need to use it. 87 if (mCamera != null) { 88 mCamera.release() 89 mCamera = null; 90 } 91} 92</pre> 93 94<p>一般的には、(フォームに入力された個人情報などの)ユーザーの変更を永続的なストレージに保存する目的の場合には、{@link android.app.Activity#onPause()} の使用は<strong>避ける</strong>必要があります。 95特定のユーザーが(メールの下書きのように)変更の自動保存を期待していると確信できる場合のみ、{@link android.app.Activity#onPause()}の期間内に永続的なストレージにユーザーの変更を保持する必要があります。ただし、{@link 96android.app.Activity#onPause()} メソッド中にはデータベースへの書き込みなどの CPU に高負荷をかける作業を行うことは避けてください。これにより、次のアクティビティへの表示上の遷移を遅らせる可能性があります(代わりに 97{@link android.app.Activity#onStop onStop()} メソッド中に高負荷のシャットダウン操作を実行する必要があります)。 98 99 100 101</p> 102 103<p>{@link android.app.Activity#onPause 104onPause()} メソッドで実行される処理量を比較的シンプルに抑えて、アクティビティが実際に停止している場合にユーザーの次の移動先への迅速な遷移を可能にする必要があります。 105</p> 106 107<p class="note"><strong>注:</strong> アクティビティが一時停止されると、{@link 108android.app.Activity} インスタンスはメモリに常駐し、アクティビティが再開されたときに再び呼び出されます。再開状態に導くいずれかのコールバック メソッドの間に作成されたコンポーネントを再初期化する必要はありません。 109 110</p> 111 112 113 114<h2 id="Resume">アクティビティを再開する</h2> 115 116<p>ユーザーが一時停止状態からアクティビティを再開した場合、システムは、{@link 117android.app.Activity#onResume()} メソッドを呼び出します。</p> 118 119<p>新規に作成された場合を含め、アクティビティがフォアグラウンドに表示されるたびに、システムがこのメソッドを呼び出すことに注意してください。 120したがって、{@link 121android.app.Activity#onPause()} メソッド中に解放したコンポーネントの初期化、およびアクティビティが再開状態になるたびに発生するその他の初期化(アニメーションの開始や、アクティビティがユーザーのフォーカスを取得したときにのみ使用されるコンポーネントの初期化など)を実行するように、{@link 122android.app.Activity#onResume()} を実装する必要があります。 123 124</p> 125 126<p>{@link android.app.Activity#onResume()} に関する次の例は、上記の 127{@link android.app.Activity#onPause()} に関する例に対応するものであり、アクティビティが一時停止したときに解放されたカメラ機能を初期化します。 128</p> 129 130<pre> 131@Override 132public void onResume() { 133 super.onResume(); // Always call the superclass method first 134 135 // Get the Camera instance as the activity achieves full user focus 136 if (mCamera == null) { 137 initializeCamera(); // Local method to handle camera init 138 } 139} 140</pre> 141 142 143 144 145 146 147 148