Skip to content

Most visited

Recently visited

navigation

アクティビティを開始する

main() メソッドを使用してアプリを起動する他のプログラミング パラダイムとは異なり、Android システムでは、そのライフサイクルの特定の段階に対応する特定のコールバック メソッドを呼び出すことによって、Activity インスタンスでコードを開始します。 アクティビティを起動するコールバック メソッドのシーケンスと、アクティビティを破棄するコールバック メソッドのシーケンスがあります。

このレッスンでは、最も重要なライフサイクル メソッドの概要を示し、アクティビティの新しいインスタンスを作成する最初のライフサイクル コールバックを扱う方法について説明します。

ライフサイクル コールバックを理解する

アクティビティの存続期間において、システムは、階段ピラミッド型のシーケンスで、ライフサイクル メソッドのコアセットを呼び出します。 つまり、アクティビティのライフサイクルの各段階は、ピラミッドの個別の段です。 システムが新しいアクティビティのインスタンスを作成すると、各コールバック メソッドはアクティビティ状態を 1 ステップ上に向かって移動させます。 ピラミッドの頂点は、アクティビティがフォアグラウンドで実行されるポイントであり、ユーザーはそこで操作を行うことができます。

ユーザーがアクティビティを離れる操作を始めると、システムはアクティビティを破棄するために、アクティビティ状態をピラミッドの下に向かって移動させる、別のメソッドを呼び出します。 アクティビティがピラミッドの下に向かって途中まで移動し、待機する場合がありますが(ユーザーが別のアプリに切り替えた場合など)、そのポイントからアクティビティは頂点に戻ることができ(ユーザーがアクティビティに戻った場合)、アクティビティはユーザーが離れた場所から再開します。

図 1. アクティビティのライフサイクルの簡略図は階段ピラミッドとして表現されます。 ここでは、アクティビティを頂点の再開状態に向かって 1 ステップ移動させるために使用されるすべてのコールバックに対して、下に向かってアクティビティを移動させるコールバック メソッドがどのように分布しているかを示しています。 アクティビティはまた、一時停止や停止の状態から再開した状態に復帰することができます。

アクティビティの複雑さにもよりますが、すべてのライフサイクル メソッドを実装する必要はありません。 ただし、それぞれを理解して、自分のアプリがユーザーの期待どおり動作するよう実装することが重要です。 アクティビティのライフサイクル メソッドを正しく実装すると、自分のアプリが次を含めたいくつかの状態で良好に動作するようになります。

次のレッスンで学習するように、図 1 に示されているさまざまな状態間のアクティビティ遷移には、いくつかの状況があります。ただし、これらの状態のうち 3 つのみが静的なものとなります。 すなわち、アクティビティが長期間にわたる場合、3 つの状態のいずれかで存在することになります。

再開状態
この状態では、アクティビティがフォアグラウンドで実行され、ユーザーはそこで操作を行うことができます(「実行」状態とも呼ばれます)。
一時停止状態
この状態では、アクティビティは別のアクティビティによって部分的に隠されています。フォアグラウンドにある別のアクティビティは半透明になっているか、全画面をカバーしていません。 一時停止したアクティビティはユーザーの入力を受信せず、一切のコードを実行できません。
停止状態
この状態では、アクティビティは完全に隠され、ユーザーには表示されません。バックグラウンドに存在するとみなされます。 停止状態の間、アクティビティ インスタンスとメンバー変数のようなそのすべての状態情報は保持されますが、アクティビティ インスタンスは一切のコードを実行できません。

他の状態(作成や起動の状態)は一過性であり、システムはすぐに次のライフサイクル コールバック メソッドを呼び出して、次の状態に移動します。 つまり、システムはonCreate() を呼び出した直後に onStart() を呼び出しますが、この後すぐに onResume() が続きます。

以上が、アクティビティの基本ライフサイクルです。次に、特定のライフサイクルの動作のいくつかについて学習を開始しましょう。

アプリのランチャー アクティビティを指定する

ユーザーがホーム スクリーンからアプリのアイコンを選択すると、システムはアプリ内で「ランチャー」(または「メイン」)のアクティビティであると宣言された Activity に対して onCreate() メソッドを呼び出します。 これは、アプリのユーザー インターフェースへのメインのエントリ ポイントとして機能するアクティビティです。

プロジェクト ディレクトリのルートにある Android のマニフェスト ファイル AndroidManifest.xml で、メインのアクティビティとしてどのアクティビティを使用するかを定義することができます。

アプリのメインのアクティビティは、MAIN アクションと LAUNCHER カテゴリを含む <intent-filter> を使用してマニフェストで宣言する必要があります。 次に例を示します。

<activity android:name=".MainActivity" android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

注: Android SDK ツールを使用して新しい Android プロジェクトを作成すると、デフォルトのプロジェクト ファイルに、このフィルタを用いてマニフェストで宣言された Activity クラスが含まれます。

自分のアクティビティの 1 つについて、MAIN アクションまたは LAUNCHER カテゴリのいずれかが宣言されていない場合は、アプリのアイコンがホーム スクリーンのアプリリストに表示されません。

新しいインスタンスを作成する

ほとんどのアプリには、ユーザーが異なるアクションを実行できるようにする、いくつかの異なるアクティビティが含まれます。そのアクティビティが、ユーザーがアプリのアイコンをクリックしたときに作成されるメインのアクティビティであれ、ユーザーのアクションに応答してアプリが開始する別のアクティビティであれ、システムはその onCreate() メソッドを呼び出すことにより、Activity の新しいインスタンスを毎回作成します。

アクティビティの存続期間すべてにわたり、一度のみ発生すべき基本的なアプリの起動ロジックを実行するための onCreate() メソッドを実装する必要があります。 たとえば、onCreate() の実装では、ユーザー インターフェースを定義し、場合によってはいくつかのクラススコープの変数をインスタンス化する必要があります。

たとえば、onCreate() メソッドに関する次の例では、(XML レイアウト ファイルで定義される)ユーザー インターフェースを宣言したり、メンバー変数を定義したり、UI の一部を構成したりするなどの、アクティビティ用のいくつかの基本的なセットアップを実行する複数のコードを示しています。

TextView mTextView; // Member variable for text view in the layout

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Set the user interface layout for this Activity
    // The layout file is defined in the project res/layout/main_activity.xml file
    setContentView(R.layout.main_activity);

    // Initialize member TextView so we can manipulate it later
    mTextView = (TextView) findViewById(R.id.text_message);

    // Make sure we're running on Honeycomb or higher to use ActionBar APIs
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        // For the main activity, make sure the app icon in the action bar
        // does not behave as a button
        ActionBar actionBar = getActionBar();
        actionBar.setHomeButtonEnabled(false);
    }
}

警告: SDK_INT を上記のように使用すると、古いシステムが新しい API を実行するのを回避することができます。ただしこれは Android 2.0(API レベル 5)以降でのみ有効です。 古いバージョンでは、実行時の例外が発生します。

onCreate() の実行が終了すると、システムが引き続き onStart()onResume() メソッドを呼び出します。 アクティビティは、作成や開始の状態で留まることはありません。技術的には、アクティビティは onStart() が呼び出されたときにユーザーに表示されますが、すぐに onResume() が続き、電話の着信やユーザーが別のアクティビティに移動したり、端末の画面がオフになったりした際のように、状態を変える状況が発生するまで、アクティビティは再開状態のままとなります。

この後に続く他のレッスンでは、その他の起動メソッドである onStart()onResume() を扱います。これらのメソッドが、一時停止状態または停止状態からアクティビティを再開するために使用された場合、アクティビティのライフサイクルにおいて、いかに有用であるかを説明します。

注: onCreate() メソッドには、アクティビティの再作成についての後続のレッスンで説明している savedInstanceState と呼ぶパラメータが含まれています。

図 2. 図 1 と同じアクティビティのライフサイクル構造ですが、ここでは、アクティビティの新しいインスタンスを作成する際にシステムが順に呼び出す 3 つの主なコールバック、onCreate()onStart()onResume() を強調しています。 コールバックのこのシーケンスが完了すると、アクティビティは再開状態に達し、ユーザーは別のアクティビティに切り替えるまではこのアクティビティを操作できます。

アクティビティを破棄する

アクティビティの最初のライフサイクル コールバックは、onCreate() であり、最終のコールバックは onDestroy() です。システムは、アクティビティのインスタンスが完全にシステムメモリから削除される最終的な指示として、アクティビティでこのメソッドを呼び出します。

ほとんどのアプリでは、このメソッドを実装する必要はありません。なぜなら、ローカルのクラス参照はアクティビティによって破棄され、自身のアクティビティでは、onPause()onStop() の間にほぼすべてのクリーンアップを実行する必要があるからです。 ただし、アクティビティに、onCreate() の間に作成したバックグラウンド スレッド、または正常に閉じないとメモリのリークを引き起こす可能性のある長時間使用するリソースが含まれている場合は、onDestroy() の間にそれらを破棄する必要があります。

@Override
public void onDestroy() {
    super.onDestroy();  // Always call the superclass

    // Stop method tracing that the activity started during onCreate()
    android.os.Debug.stopMethodTracing();
}

注: ほぼすべての状況で、システムは onPause()onStop() を呼び出した後に onDestroy() を呼び出します。唯一の例外は、onCreate() メソッド内から finish() を呼び出したときです。 自身のアクティビティが別のアクティビティを起動するための一時的な意思決定機能として働くようなケースでは、onCreate() 内から finish() を呼び出してアクティビティを破棄できます。 この場合、システムは他のライフサイクルの任意のメソッドを呼び出すことなく、すぐに onDestroy() を呼び出します。

This site uses cookies to store your preferences for site-specific language and display options.

Hooray!

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a one-minute survey?
Help us improve Android tools and documentation.