Activity
クラスは Android アプリの重要なコンポーネントであり、アクティビティの開始方法と組み立て方法はプラットフォームのアプリケーション モデルを構成する際の基本的な要素です。main()
メソッドで起動するアプリをプログラミングする際の枠組みとは異なり、Android システムでは、ライフサイクルのそれぞれの段階に対応するコールバック メソッドを呼び出すことにより、Activity
インスタンス内のコードが開始されます。
このドキュメントでは、アクティビティのコンセプトを紹介し、それを使いこなす方法について簡単に説明します。アプリの設計に関するおすすめの方法については、アプリ アーキテクチャのガイドをご覧ください。
アクティビティのコンセプト
モバイルアプリのエクスペリエンスはパソコンと異なり、ユーザーの操作が必ずしも同じ場所で開始されるとは限りません。ユーザーの操作が定められた状態で開始されることはほとんどありません。たとえば、ホーム画面からメールアプリを開くと、メールの一覧が表示されます。一方、ソーシャルメディア アプリを使用していて、そのアプリからメールアプリを起動した場合は、メールアプリのメール作成画面に直接移動できます。
Activity
クラスは、このような枠組みを利用しやすいように設計されています。1 つのアプリが別のアプリを呼び出すとき、呼び出し元のアプリは、別のアプリ全体をひとまとめとして呼び出すのではなく、その中のアクティビティを呼び出します。そうすることで、アクティビティが、アプリがユーザーとやり取りする際のエントリ ポイントとして機能します。なお、アクティビティの実装は Activity
クラスのサブクラスとして行います。
アクティビティにより、アプリが UI を描画するウィンドウが用意されます。通常、このウィンドウは画面全体に表示されますが、画面よりも小さく、他のウィンドウの上に重なることもあります。一般に、1 つのアクティビティがアプリ内の 1 つの画面を実装します。たとえば、アプリのアクティビティの 1 つが「設定」画面を実装し、他のアクティビティが「写真を選択」画面を実装します。
ほとんどのアプリには複数の画面があります。つまり、複数のアクティビティから構成されます。通常、アプリ内の 1 つのアクティビティがメイン アクティビティに指定されます。これは、ユーザーがアプリを起動したときに最初に表示される画面です。各アクティビティは、さまざまなアクションを実行するために別のアクティビティを開始できます。たとえば、シンプルなメールアプリのメイン アクティビティでは、受信トレイが表示されます。そして、メイン アクティビティから、メールの作成や個々のメール表示などのタスク用画面を表示するアクティビティが開始されます。
アクティビティ同士が連携してアプリ内にまとまりのあるユーザー エクスペリエンスを形成しますが、各アクティビティは他のアクティビティと緩やかに結びついているだけです。アプリ内のアクティビティ間に依存関係はほとんどありません。アクティビティが他のアプリに属するアクティビティを開始することも実際によくあります。たとえば、ブラウザアプリがソーシャルメディア アプリの共有アクティビティを起動することもあります。
アクティビティをアプリで使用するには、アプリのマニフェストにその情報を登録する必要があります。また、アクティビティのライフサイクルを適切に管理する必要もあります。このドキュメントの後半では、これらのトピックについて説明します。
マニフェストの設定
アプリでアクティビティを使用できるようにするには、マニフェストでアクティビティとその属性を宣言する必要があります。
アクティビティを宣言する
アクティビティを宣言するには、マニフェスト ファイルを開き、<application> 要素の子として <activity> 要素を追加します。例:
<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 を呼び出すアプリに必要な権限を 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()
は、アクティビティもしくはアクティビティを含むプロセスが破棄される際に、アクティビティのリソースがすべて解放されるように実装されます。
このセクションでは、このトピックの概要についてのみ説明します。アクティビティのライフサイクルとそのコールバックの取り扱いの詳細については、アクティビティのライフサイクルをご覧ください。