Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e562bb6b authored by David Friedman's avatar David Friedman Committed by Android (Google) Code Review
Browse files

Merge "Docs: Localizations of Android dev on-boarding training docs. Bug:...

Merge "Docs: Localizations of Android dev on-boarding training docs. Bug: 20503574" into mnc-preview-docs
parents 16add46c c921ee10
Loading
Loading
Loading
Loading
+72 −0
Original line number Diff line number Diff line
page.title=アクティビティのライフサイクル 管理
page.tags=アクティビティのライフサイクル
helpoutsWidget=true

trainingnavtop=true
startpage=true

@jd:body

<div id="tb-wrapper">
<div id="tb">


<h2>必要な知識と前提条件</h2>
<ul>
  <li>Android プロジェクトの作成方法(<a href="{@docRoot}training/basics/firstapp/creating-project.html">Android
プロジェクトの作成</a>を参照)</li>
</ul>


<h2>関連ドキュメント</h2>
<ul>
  <li><a href="{@docRoot}guide/components/activities.html">アクティビティ</a></li>
</ul>


<h2>試してみる</h2>

<div class="download-box">
 <a href="http://developer.android.com/shareables/training/ActivityLifecycle.zip" class="button">デモのダウンロード</a>
 <p class="filename">ActivityLifecycle.zip</p>
</div>

</div>
</div>

<p>ユーザーがアプリ内を移動したり、アプリ外に移動したり、再びアプリに戻ったりすると、アプリの
{@link android.app.Activity} インスタンスが、それらのライフサイクルの異なる状態間で遷移します。
たとえば、アクティビティが新規に開始されると、システムのフォアグラウンドに表示され、ユーザーに認識されるようにします。

このプロセスの間に、Android システムは、ユーザー インターフェースやその他のコンポーネントが設定されたアクティビティ上で一連のライフサイクル メソッドを呼び出します。
ユーザーが別のアクティビティを開始する、または別のアプリに切り替えるアクションを実行した場合、システムはアクティビティ上で別の一連のライフサイクル メソッドを呼び出し、アクティビティがバックグラウンドに移動します(この場合、アクティビティが表示されなくなりますが、インスタンスとその状態はそのまま維持されます)。


</p>

<p>ライフサイクル コールバック メソッドでは、ユーザーがアクティビティを離れたり、再開させたりした場合のアクティビティの動作について宣言することができます。
たとえば、ストリーミング ビデオ プレーヤーをビルドしている場合、ユーザーが別のアプリに切り替えた際にビデオを一時停止したり、ネットワーク接続を終了することが可能です。ユーザーが戻った場合には、ネットワークに再接続し、一時停止した場所からビデオを再開できるようにすることができます。


</p>

<p>このクラスでは、各 {@link
android.app.Activity} インスタンスが受け取る重要なライフサイクル コールバック メソッドについて、またそれらを使用してユーザーが期待する内容でアクティビティを動作させる方法、アクティビティがそれらを必要としないときにシステムのリソースを消費しないようにする方法について学習します。
</p>

<h2>レッスン</h2>
 
<dl>
  <dt><b><a href="starting.html">アクティビティを開始する</a></b></dt>
  <dd>アクティビティのライフサイクルに関する基本、ユーザーがアプリを起動する方法、基本的なアクティビティ作成の方法について学習します。
</dd>
  <dt><b><a href="pausing.html">アクティビティの一時停止と再開</a></b></dt>
  <dd>アクティビティが一時停止状態(部分的に不可視)および、再開された場合の動作、そしてこれらの状態の変遷時に何をすべきかについて学習します。
</dd>
  <dt><b><a href="stopping.html">アクティビティの停止と再起動</a></b></dt>
  <dd>ユーザーが完全にアクティビティから移動し、その後戻ってきた場合の動作について学習します。</dd>
  <dt><b><a href="recreating.html">アクティビティを再作成する</a></b></dt>
  <dd>アクティビティが破棄されるときの動作と、必要に応じてアクティビティの状態を再構築する方法について学習します。
</dd>
</dl> 
+147 −0
Original line number Diff line number Diff line
page.title=アクティビティの一時停止と再開
page.tags=アクティビティのライフサイクル
helpoutsWidget=true

trainingnavtop=true

@jd:body

<div id="tb-wrapper">
  <div id="tb">
    
    <h2>このレッスンでの学習内容</h2>
    <ol>
      <li><a href="#Pause">アクティビティを一時停止する</a></li>
      <li><a href="#Resume">アクティビティを再開する</a></li>
    </ol>
    
    <h2>関連ドキュメント</h2>
    <ul>
      <li><a href="{@docRoot}guide/components/activities.html">アクティビティ</a>
      </li>
    </ul>

<h2>試してみる</h2>

<div class="download-box">
 <a href="http://developer.android.com/shareables/training/ActivityLifecycle.zip" class="button">デモのダウンロード</a>
 <p class="filename">ActivityLifecycle.zip</p>
</div>

  </div>
</div>

<p>通常のアプリの使用中、フォアグラウンドのアクティビティは、他のビジュアル コンポーネントによって隠される場合があり、これによりアクティビティが<em>一時停止</em>します。
たとえば、半透明のアクティビティが開くと(ダイアログのスタイルなど)、以前のアクティビティは一時停止します。
そのアクティビティは、まだ部分的に表示されていても、現在フォーカスされているアクティビティではない状態である限り、一時停止状態が維持されます。
</p>

<p>ただし、アクティビティが完全に隠され、表示されなくなった場合は、<em>停止</em>します(これについては次のレッスンで説明します)。
</p>

<p>アクティビティが一時停止状態に入ると、一時停止中は継続させない方が望ましい進行中のアクション(ビデオなど)を停止させたり、ユーザーがアプリを離れたままになった場合に備えて保存する必要のある情報すべてを保持したりできるよう、システムは {@link android.app.Activity} 上で {@link
android.app.Activity#onPause onPause()} メソッドを呼び出します。ユーザーが一時停止状態からアクティビティに復帰した場合は、システムはアクティビティを再開し、{@link android.app.Activity#onResume onResume()} メソッドを呼び出します。



</p>

<p class="note"><strong>注:</strong> アクティビティが {@link
android.app.Activity#onPause()} の呼び出しを受信した場合は、アクティビティが一瞬一時停止された後、ユーザーが同アクティビティにフォーカスを戻す可能性があることを示している場合があります。
ただし、通常は、ユーザーがアクティビティを離れていることを最初に示すものです。
</p>

<img src="{@docRoot}images/training/basics/basic-lifecycle-paused.png" />
<p class="img-caption"><strong>図 1.</strong>半透明のアクティビティによって自分のアクティビティが隠されると、システムは {@link android.app.Activity#onPause onPause()} を呼び出し、アクティビティは一時停止の状態で待機します(1)。

一時停止中にユーザーがアクティビティに復帰した場合、システムは {@link android.app.Activity#onResume onResume()} を呼び出します(2)。
</p>


<h2 id="Pause">アクティビティを一時停止する</h2>
      
<p>システムがアクティビティに対して {@link android.app.Activity#onPause()} を呼び出した場合、技術的にはアクティビティはまだ部分的に表示されていることを意味しますが、ほとんどの場合は、ユーザーがアクティビティを離れていて、ほどなく停止状態になる徴候を示しています。

通常、以下を行う場合には、{@link android.app.Activity#onPause()} コールバックを使用する必要があります。
</p>

<ul>
  <li>CPU を消費する可能性があるアニメーションや他の進行中のアクションを停止する。</li>
  <li>ユーザーがアクティビティを離れた場合にも変更が永続的に保存されると期待するような場合(メールの下書きなど)でのみ、未保存の変更をコミットする。
</li>
  <li>放送用レシーバーなどのシステム リソース、(GPS
などの)センサー処理や、アクティビティが一時停止され、ユーザーが必要としない間にバッテリー寿命に影響を与える可能性があるすべてのリソースを解放する。
</li>
</ul>

<p>たとえば、アプリケーションが {@link android.hardware.Camera} を使用する場合、{@link android.app.Activity#onPause()} メソッドは、リソースの解放に適した手段です。
</p>

<pre>
&#64;Override
public void onPause() {
    super.onPause();  // Always call the superclass method first

    // Release the Camera because we don't need it when paused
    // and other activities might need to use it.
    if (mCamera != null) {
        mCamera.release()
        mCamera = null;
    }
}
</pre>

<p>一般的には、(フォームに入力された個人情報などの)ユーザーの変更を永続的なストレージに保存する目的の場合には、{@link android.app.Activity#onPause()} の使用は<strong>避ける</strong>必要があります。
特定のユーザーが(メールの下書きのように)変更の自動保存を期待していると確信できる場合のみ、{@link android.app.Activity#onPause()}の期間内に永続的なストレージにユーザーの変更を保持する必要があります。ただし、{@link
android.app.Activity#onPause()} メソッド中にはデータベースへの書き込みなどの CPU に高負荷をかける作業を行うことは避けてください。これにより、次のアクティビティへの表示上の遷移を遅らせる可能性があります(代わりに
{@link android.app.Activity#onStop onStop()} メソッド中に高負荷のシャットダウン操作を実行する必要があります)。



</p>

<p>{@link android.app.Activity#onPause
onPause()} メソッドで実行される処理量を比較的シンプルに抑えて、アクティビティが実際に停止している場合にユーザーの次の移動先への迅速な遷移を可能にする必要があります。
</p>

<p class="note"><strong>注:</strong> アクティビティが一時停止されると、{@link
android.app.Activity} インスタンスはメモリに常駐し、アクティビティが再開されたときに再び呼び出されます。再開状態に導くいずれかのコールバック メソッドの間に作成されたコンポーネントを再初期化する必要はありません。

</p>



<h2 id="Resume">アクティビティを再開する</h2>

<p>ユーザーが一時停止状態からアクティビティを再開した場合、システムは、{@link
android.app.Activity#onResume()} メソッドを呼び出します。</p>

<p>新規に作成された場合を含め、アクティビティがフォアグラウンドに表示されるたびに、システムがこのメソッドを呼び出すことに注意してください。
したがって、{@link
android.app.Activity#onPause()} メソッド中に解放したコンポーネントの初期化、およびアクティビティが再開状態になるたびに発生するその他の初期化(アニメーションの開始や、アクティビティがユーザーのフォーカスを取得したときにのみ使用されるコンポーネントの初期化など)を実行するように、{@link
android.app.Activity#onResume()} を実装する必要があります。

</p>

<p>{@link android.app.Activity#onResume()} に関する次の例は、上記の
{@link android.app.Activity#onPause()} に関する例に対応するものであり、アクティビティが一時停止したときに解放されたカメラ機能を初期化します。
</p>

<pre>
&#64;Override
public void onResume() {
    super.onResume();  // Always call the superclass method first

    // Get the Camera instance as the activity achieves full user focus
    if (mCamera == null) {
        initializeCamera(); // Local method to handle camera init
    }
}
</pre>






+178 −0
Original line number Diff line number Diff line
page.title=アクティビティを再作成する
page.tags=アクティビティのライフサイクル
helpoutsWidget=true

trainingnavtop=true

@jd:body

<div id="tb-wrapper">
  <div id="tb">
    
    <h2>このレッスンでの学習内容</h2>
    <ol>
      <li><a href="#SaveState">自分のアクティビティ状態を保存する</a></li>
      <li><a href="#RestoreState">自分のアクティビティ状態をリストアする</a></li>
    </ol>
    
    <h2>関連ドキュメント</h2>
    <ul>
      <li><a href="{@docRoot}training/basics/supporting-devices/screens.html">異なる画面のサポート
</a></li>
      <li><a href="{@docRoot}guide/topics/resources/runtime-changes.html">実行時の変更を処理する</a></li>
      <li><a href="{@docRoot}guide/components/activities.html">アクティビティ</a>
      </li>
    </ul>

  </div>
</div>

<p>アクティビティには、通常のアプリの動作によって破棄されるいくつかのシナリオがあります。たとえば、ユーザーが <em>[戻る]</em> ボタンを押したり、アクティビティが {@link android.app.Activity#finish()} を呼び出すことによって自身の破棄を知らせる場合などです。

システムはまた、現在停止していて長時間使用されていないアクティビティがある場合や、フォアグラウンドのアクティビティが多くのリソースを必要とするためにシステムがメモリを取り戻すためにバックグラウンド プロセスを停止する必要がある場合にも、アクティビティを破棄することがあります。

</p>

<p>ユーザーが <em>[戻る]</em> を押すか、アクティビティ自身が終了することでアクティビティが破棄されたとき、これらの動作はアクティビティの必要性がなくなったことを示すため、システムの方針として {@link android.app.Activity} インスタンスは永遠に失われます。

システムの制約(通常のアプリの動作ではなく)が原因で
アクティビティが破棄される場合、実際の
{@link android.app.Activity} インスタンスは失われますが、アクティビティが存在していたことをシステムが記憶しているため、ユーザーがアクティビティに復帰した場合は、破棄されたときのアクティビティの状態を記述する一連の保存されたデータを使用して、アクティビティの新しいインスタンスが作成されます。

システムが以前の状態を復元するために使用する保存されたデータは、「インスタンス状態」と呼ばれ、{@link android.os.Bundle} オブジェクトに格納されたキーと値のペアの集合です。

</p>

<p class="caution"><strong>警告: </strong>ユーザーが画面を回転させるたびに、アクティビティが破棄され、再作成されます。
画面の向きが変更されると、画面構成が変更され、アクティビティで(レイアウトなどの)代替リソースをロードする必要が生じる場合があるため、システムはフォアグラウンドのアクティビティを破棄し、再作成します。

</p>

<p>デフォルトでは、システムは {@link android.os.Bundle} のインスタンス状態を使用して、アクティビティのレイアウトの各 {@link android.view.View} オブジェクトに関する情報を保存しています({@link android.widget.EditText} オブジェクトに入力されたテキスト値など)。

アクティビティのインスタンスが破棄され、再作成される場合、レイアウトの状態はコードを必要とすることなく以前の状態に復元されます。

しかし、アクティビティでは、アクティビティにおけるユーザーの作業状況を追跡しているメンバ変数などの、復元することが望ましいその他の情報が存在する可能性があります。

</p>

<p class="note"><strong>注:</strong> Android システムがアクティビティのビューの状態を復元できるようにするためには、<strong>各ビューは固有の ID を持っている必要があります</strong>。これは
 <a href="{@docRoot}reference/android/view/View.html#attr_android:id">{@code
android:id}</a> によって提供されます。
</p>

<p>アクティビティ状態についての追加データを保存するには、
{@link android.app.Activity#onSaveInstanceState onSaveInstanceState()} コールバック メソッドをオーバーライドする必要があります。システムは、ユーザーがアクティビティを離れようとするとこのメソッドを呼び出し、{@link android.os.Bundle} オブジェクトに渡してアクティビティが予期せずに破棄された場合に備えて保存します。


システムが後でアクティビティのインスタンスを再作成する必要がある場合は、同じ {@link
android.os.Bundle} オブジェクトを {@link android.app.Activity#onRestoreInstanceState
onRestoreInstanceState()} と {@link android.app.Activity#onCreate onCreate()}
 の両方のメソッドに渡します。
</p>

<img src="{@docRoot}images/training/basics/basic-lifecycle-savestate.png" />
<p class="img-caption"><strong>図 2.</strong> システムがアクティビティを停止し始めると、
{@link android.app.Activity#onSaveInstanceState onSaveInstanceState()}(1)が呼び出されるため、{@link android.app.Activity} インスタンスの再作成の必要がある場合に備えて、保存する追加の状態データを指定できます。アクティビティが破棄され、同じインスタンスを再作成する必要がある場合、システムは(1)で定義された状態データを {@link android.app.Activity#onCreate onCreate()} メソッド(2)と 
{@link android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} メソッド(3)の両方に渡します。




</p>



<h2 id="SaveState">自分のアクティビティ状態を保存する</h2>

<p>アクティビティが停止し始めると、システムは {@link android.app.Activity#onSaveInstanceState
onSaveInstanceState()} を呼び出すため、アクティビティではキー値のペアのコレクションを使用して、状態情報を保存することができます。
このメソッドのデフォルトの実装では、{@link android.widget.EditText} ウィジェット内のテキストまたは {@link android.widget.ListView} のスクロール位置などのアクティビティのビュー階層の状態に関する情報が保存されます。

</p>

<p>アクティビティの追加の状態情報を保存するには、
{@link android.app.Activity#onSaveInstanceState onSaveInstanceState()} を実装し、{@link android.os.Bundle} オブジェクトにキー値のペアを追加する必要があります。
次に例を示します。</p>

<pre>
static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...

&#64;Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);
    
    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}
</pre>

<p class="caution"><strong>警告: </strong>デフォルトの実装でビュー階層の状態を保存できるよう、{@link
android.app.Activity#onSaveInstanceState onSaveInstanceState()} のスーパークラスの実装を常に呼び出す必要があります。
</p>



<h2 id="RestoreState">自分のアクティビティ状態をリストアする</h2>

<p>以前破棄された後にアクティビティが再作成される場合、システムがアクティビティを渡した先の {@link android.os.Bundle} から、保存済みの状態を回復することができます。

{@link android.app.Activity#onCreate onCreate()} と {@link
android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} の両方のコールバック メソッドが、インスタンスの状態情報を含む同じ {@link android.os.Bundle} を受け取ります。
</p>

<p>{@link android.app.Activity#onCreate onCreate()} メソッドは、システムがアクティビティの新しいインスタンスを作成しているか、以前のものを復元しているかどうかに関係なく呼び出されるため、状態の {@link android.os.Bundle} を読み取る前にこれが null かどうかを確認する必要があります。

null の場合は、破棄された以前のアクティビティを復元する代わりにアクティビティの新しいインスタンスが作成されます。

</p>

<p>{@link android.app.Activity#onCreate
onCreate()} で、いくつかの状態データを復元する方法について、次に例を示します。</p>

<pre>
&#64;Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); // Always call the superclass first
   
    // Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        // Restore value of members from saved state
        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
    } else {
        // Probably initialize members with default values for a new instance
    }
    ...
}
</pre>

<p>{@link android.app.Activity#onCreate onCreate()} 中に状態を復元する代わりに、
{@link android.app.Activity#onStart()} メソッドの後に呼び出される {@link
android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} の実装を選択できます。
復元対象の保存済みの状態がある場合のみ {@link
android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} が呼び出されるため、
{@link android.os.Bundle} が null であるかどうかをチェックする必要はありません。</p>
        
<pre>
public void onRestoreInstanceState(Bundle savedInstanceState) {
    // Always call the superclass so it can restore the view hierarchy
    super.onRestoreInstanceState(savedInstanceState);
   
    // Restore state members from saved instance
    mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}
</pre>

<p class="caution"><strong>警告: </strong>デフォルトの実装でビュー階層の状態を復元できるよう、{@link
android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} のスーパークラスの実装を常に呼び出す必要があります。
</p>

<p>実行時の再起動イベント(画面が回転したときなど)によるアクティビティの再作成の詳細については、<a href="{@docRoot}guide/topics/resources/runtime-changes.html">実行時の変更を処理する</a>をお読みください。
</p>
+285 −0

File added.

Preview size limit exceeded, changes collapsed.

+187 −0

File added.

Preview size limit exceeded, changes collapsed.

Loading