アクティビティの概要

Activity クラスは Android アプリの重要なコンポーネントであり、アクティビティの起動方法と組み立て方法は、プラットフォームのアプリモデルの基本的な部分です。main() メソッドでアプリを起動するプログラミング パラダイムとは異なり、Android システムは、ライフサイクルの特定の段階に対応する特定のコールバック メソッドを呼び出すことで、Activity インスタンスでコードを開始します。

このドキュメントでは、アクティビティのコンセプトを紹介し、アクティビティの操作方法に関する簡単なガイダンスを紹介します。アプリを設計する際のベスト プラクティスについて詳しくは、 アプリ アーキテクチャ ガイドをご覧ください。

アクティビティのコンセプト

モバイルアプリのエクスペリエンスは、ユーザーによるアプリの操作が常に同じ場所から開始されるわけではない点で、パソコン版とは異なります。多くの場合、ユーザー ジャーニーは非決定論的に始まります。たとえば、ホーム画面からメールアプリを開くと、メールのリストが表示されます。一方、ソーシャル メディア アプリを使用していてメールアプリを起動した場合は、メールアプリの画面に直接移動してメールを作成できます。

Activity クラスは、このパラダイムを容易にするように設計されています。一方のアプリが別のアプリを呼び出した場合、呼び出し元アプリは、アプリ全体をアトミックにするのではなく、もう一方のアプリのアクティビティを呼び出します。このように、アクティビティはアプリとユーザーとのインタラクションのエントリ ポイントとして機能します。アクティビティは Activity クラスのサブクラスとして実装します。

アクティビティは、アプリが UI を描画するウィンドウを提供します。このウィンドウは通常画面全体に表示されますが、画面よりも小さく、他のウィンドウの上にフロートされる場合があります。通常、1 つのアクティビティはアプリに 1 つの画面を実装します。たとえば、アプリのアクティビティの 1 つが設定画面を実装し、別のアクティビティで写真を選択画面を実装します。

ほとんどのアプリには複数の画面があり、複数のアクティビティで構成されます。通常、アプリ内の 1 つのアクティビティをメイン アクティビティとして指定します。これは、ユーザーがアプリを起動したときに最初に表示される画面です。各アクティビティは、別のアクティビティを起動してさまざまなアクションを実行できます。たとえば、シンプルなメールアプリのメイン アクティビティは、メールの受信トレイを表示する画面を提供します。そこから、メイン アクティビティは、メールの作成や個々のメールの開封などのタスク用の画面を提供する他のアクティビティを起動することがあります。

各アクティビティが連携してアプリ内でまとまったユーザー エクスペリエンスを形成しますが、各アクティビティは他のアクティビティに緩くバインドされているだけです。通常は、アプリ内のアクティビティ間の依存関係は最小限です。実際、アクティビティは多くの場合、他のアプリに属するアクティビティを起動します。たとえば、ブラウザアプリがソーシャル メディア アプリの共有アクティビティを起動する場合です。

アプリでアクティビティを使用するには、アクティビティに関する情報をアプリのマニフェストに登録し、アクティビティのライフサイクルを適切に管理する必要があります。以降、これらのテーマについて説明します。

マニフェストの設定

アプリでアクティビティを使用できるようにするには、マニフェストでアクティビティと特定の属性を宣言する必要があります。

アクティビティを宣言する

アクティビティを宣言するには、マニフェスト ファイルを開き、<activity> 要素を <application> 要素の子として追加します。次に例を示します。

<manifest ... >
  <application ... >
      <activity android:name=".ExampleActivity" />
      ...
  </application ... >
  ...
</manifest >

この要素で必須の属性は、アクティビティのクラス名を指定する android:name のみです。ラベル、アイコン、UI テーマなどのアクティビティの特性を定義する属性を追加することもできます。これらの属性とその他の属性の詳細については、 <activity> 要素のリファレンス ドキュメントをご覧ください。

注: アプリの公開後は、アクティビティ名を変更しないでください。追加すると、アプリのショートカットなど、一部の機能が使用できなくなるおそれがあります。 公開後に避けるべき変更について詳しくは、 変更できないものをご覧ください。

インテント フィルタを宣言する

インテント フィルタは、Android プラットフォームの非常に強力な機能です。明示的なリクエストだけでなく、暗黙的なリクエストに基づいてアクティビティを起動することもできます。たとえば、明示的なリクエストにより、システムに「Gmail アプリでメール送信アクティビティを開始する」ように指示することがあります。一方、暗黙的なリクエストは、システムに「ジョブを実行できる任意のアクティビティで [メールの送信] 画面を開始する」ように指示します。システム UI がタスクの実行に使用するアプリをユーザーに尋ねる場合、それはインテント フィルタが機能しています。

この機能を利用するには、 <activity> 要素で <intent-filter> 属性を宣言します。この要素の定義には、<action> 要素のほか、必要に応じて <category> 要素や <data> 要素が含まれます。これらの要素を組み合わせて、アクティビティが応答できるインテントのタイプを指定します。たとえば、次のコード スニペットは、テキストデータを送信し、他のアクティビティからそのリクエストを受け取るアクティビティを設定する方法を示しています。

<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
</activity>

この例では、<action> 要素でこのアクティビティがデータを送信することを指定しています。<category> 要素を DEFAULT として宣言すると、アクティビティが起動リクエストを受信できるようになります。<data> 要素は、このアクティビティが送信できるデータのタイプを指定します。次のコード スニペットは、上記のアクティビティを呼び出す方法を示しています。

Kotlin

val sendIntent = Intent().apply {
    action = Intent.ACTION_SEND
    type = "text/plain"
    putExtra(Intent.EXTRA_TEXT, textMessage)
}
startActivity(sendIntent)

Java

// Create the text message with a string
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.setType("text/plain");
sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);
// Start the activity
startActivity(sendIntent);
アプリを自己完結型にし、他のアプリがアクティビティを有効にできないようにする場合、他のインテント フィルタは必要ありません。他のアプリで使用できるようにしないアクティビティには、インテント フィルタを設定しないようにし、明示的インテントを使用して、アクティビティを自分で開始できます。アクティビティがインテントに応答する方法について詳しくは、インテントとインテント フィルタをご覧ください。

権限を宣言する

マニフェストの <activity> タグを使用すると、特定のアクティビティを開始できるアプリを制御できます。マニフェスト内で両方のアクティビティに同じ権限が付与されていないと、親アクティビティが子アクティビティを起動できません。親アクティビティの <uses-permission> 要素を宣言する場合、それぞれの子アクティビティは一致する <uses-permission> 要素を持つ必要があります。

たとえば、アプリが SocialApp という架空のアプリを使用してソーシャル メディアで投稿を共有する場合、SocialApp 自体で、アプリを呼び出すアプリに必要な権限を定義する必要があります。

<manifest>
<activity android:name="...."
   android:permission=”com.google.socialapp.permission.SHARE_POST”

/>

次に、SocialApp の呼び出しが許可されるには、アプリが SocialApp のマニフェストに設定されている権限と一致している必要があります。

<manifest>
   <uses-permission android:name="com.google.socialapp.permission.SHARE_POST" />
</manifest>

権限とセキュリティ全般の詳細については、セキュリティと権限をご覧ください。

アクティビティのライフサイクルの管理

アクティビティは、その存続期間を通じてさまざまな状態に遷移します。一連のコールバックを使用することで、状態間の遷移を処理します。以降のセクションでは、これらのコールバックについて説明します。

onCreate()

このコールバックを実装する必要があります。このコールバックは、システムがアクティビティを作成したときに呼び出されます。実装では、アクティビティの必須コンポーネントを初期化する必要があります。たとえば、アプリはビューを作成し、ここでリストにデータをバインドする必要があります。最も重要な点として、ここで setContentView() を呼び出してアクティビティのユーザー インターフェースのレイアウトを定義する必要があります。

onCreate() が終了すると、次のコールバックは常に onStart() になります。

onStart()

onCreate() が終了すると、アクティビティは開始状態になり、アクティビティはユーザーに表示されます。このコールバックには、アクティビティがフォアグラウンドに移動し、インタラクティブになるための最終的な準備に必要な内容が含まれています。

onResume()

アクティビティがユーザーとやり取りし始める直前に、このコールバックが呼び出されます。この時点で、アクティビティはアクティビティ スタックの一番上にあり、すべてのユーザー入力をキャプチャします。アプリのコア機能のほとんどは、onResume() メソッドに実装されています。

onPause() コールバックは常に onResume() の後に続きます。

onPause()

アクティビティがフォーカスを喪失して一時停止状態になると、onPause() が呼び出されます。この状態は、たとえば、ユーザーが戻るボタンや履歴ボタンをタップしたときに発生します。システムがアクティビティの onPause() を呼び出すと、技術的にはアクティビティはまだ部分的に表示されることになりますが、ほとんどの場合はユーザーがアクティビティを離れたことを示すものであり、アクティビティはすぐに停止状態または再開状態に移行します。

一時停止状態のアクティビティは、ユーザーが UI の更新を想定している場合に、UI の更新を続行できます。このようなアクティビティの例としては、ナビゲーション マップ画面を表示するアクティビティや、再生中のメディア プレーヤーが挙げられます。このようなアクティビティがフォーカスを失っても、ユーザーは UI の更新が継続されることを想定しています。

onPause() をアプリデータやユーザーデータの保存、ネットワーク呼び出し、データベース トランザクションの実行に使用することは避けてください。データの保存については、 アクティビティの状態の保存と復元をご覧ください。

onPause() の実行が完了すると、次のコールバックは、アクティビティが一時停止状態になった後の状況に応じて、onStop() または onResume() になります。

onStop()

アクティビティがユーザーに表示されなくなると、onStop() が呼び出されます。これは、アクティビティが破棄されている、新しいアクティビティが開始されている、または既存のアクティビティが再開状態に入って停止したアクティビティを覆っている場合に発生することがあります。いずれの場合も、停止したアクティビティは表示されなくなります。

システムが次に呼び出すコールバックは、onRestart()(アクティビティとユーザーとの対話を再開する場合)または onDestroy()(アクティビティが完全に終了する場合)のいずれかです。

onRestart()

停止状態のアクティビティが再開しようとすると、システムによってこのコールバックが呼び出されます。onRestart() は、アクティビティが停止した時点の状態を復元します。

このコールバックの後には常に onStart() が続きます。

onDestroy()

アクティビティが破棄される前に、システムがこのコールバックを呼び出します。

このコールバックは、アクティビティが受け取る最後のコールバックです。onDestroy() は通常、アクティビティまたはそのアクティビティを含むプロセスが破棄されたときに、アクティビティのリソースがすべて解放されるように実装されます。

このセクションでは、このトピックの概要についてのみ説明します。アクティビティのライフサイクルとそのコールバックの扱い方については、アクティビティのライフサイクルをご覧ください。