Androidアプリのコンポーネント
前回はAndroidアプリプロジェクトの構成について説明しました。今回はAndroidアプリのコンポーネントについて説明します。
コンポーネントとは
コンポーネントとは、Android OSによって管理される要素です。各アプリは用途に応じたコンポーネントを作成します。コンポーネントの実体はJavaのオブジェクトなので、アプリ開発者はコンポーネントとなるクラスを作ります。
コンポーネントには次の4種類があります。
- アクティビティ
- サービス
- ブロードキャストレシーバー
- コンテンツプロバイダー
AndroidManifest.xml
前回の宿題で構造を確認してもらったAndroidManifest.xmlには、アプリにどのようなコンポーネントが含まれているかを記述します。アプリが端末にインストールされると、Android OSはアプリに含まれるAndroidManifest.xmlを読み、ホーム画面にアイコンを配置したりします。
アクティビティ
アクティビティとはUI(画面)を提供するコンポーネントです。画面が1つもないアプリはまれなので、アプリにはアクティビティが1つ以上含まれます。Androidアプリ開発の初期(2009年頃)は、1画面1アクティビティでアプリを作成していましたが、イマドキのアプリは1アクティビティで複数の画面を扱います。
アプリにアクティビティを追加するには、AppCompatActivityを継承したクラスを定義し、AndroidManifest.xmlに登録します。Android OS的にはAndroid SDKに含まれるActivityクラスを継承したクラスでよいのですが、最新のライブラリの恩恵をうけることができません。特別な理由がない限り、ベースクラスはAppCompatActivityにしましょう。
AndroidManifestへの登録は、application要素の子にactivity要素で追加します。android:name属性には作成したアクティビティクラス名を指定します。クラス名が.(ドット)ではじまる場合は、ルートのmanifest要素のpackage属性で指定しているパッケージ名がドットの前に追加されたものとして扱われます。
<manifest ...
package="com.mokelab.demo.myapplication"
>
<application
...>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
サービス
サービスとは、ユーザーにUIを提供せず、バックグラウンドで何か処理を行うコンポーネントです。例えばメールの送信やファイルのダウンロードといった機能を実現する際に用いられます。メール送信といった処理はアプリを切り替えても続けてほしい処理です。アクティビティの中でメール送信処理を実行することもできますが、ユーザーが送信中にアプリを切り替えたりした場合、送信処理は止まってしまいます。
アプリにサービスを追加するには、Serviceクラスを継承したクラスを定義します。しかしServiceクラスを継承した場合、非同期処理などを注意深く実装する必要があるため、用途に応じてベースクラスを変更します(たとえばIntentServiceなど)。
AndroidManifestへの登録は、application要素の子にservice要素で追加します。android:process属性でプロセス名を指定すると、サービスの実行がアプリ本体とは別のプロセスで実行されます。
<application
...>
<service
android:name=".MyIntentService"
android:process="worker"
android:exported="false">
</service>
</application>
ブロードキャストレシーバー
電池残量の変化や言語設定の変更といったメッセージはOSによって全アプリに通知されます。この通知を受け取るためのコンポーネントがブロードキャストレシーバーです。Android初期はいろんなメッセージが受信できましたが、メッセージが飛ぶたびに対象のアプリが一斉に起動してしまうため、Android Oreo(8/API 26)あたりから動作が制限されるようになりました。
アプリにブロードキャストレシーバーを追加するには、BroadcastReceiverクラスを継承したクラスを定義します。AndroidManifest.xmlへの登録は、application要素の子にreceiver要素で追加します。
<application
...>
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
</receiver>
</application>
コンテンツプロバイダー
コンテンツプロバイダーとは、アプリの内外に対してデータ操作を提供するコンポーネントです。連絡先など、一部のデータはAndroid OSがコンテンツプロバイダーとして提供しています。
アプリにコンテンツプロバイダーを追加するには、ContentProviderクラスを継承したクラスを定義します。AndroidManifest.xmlへの登録は、application要素の子にprovider要素で追加します。
<application
...>
<provider
android:name=".MyContentProvider"
android:authorities="com.mokelab.demo.provider"
android:enabled="true"
android:exported="true">
</provider>
</application>
まとめ
Androidアプリには4種類のコンポーネントがあり、それぞれの作り方・追加方法を説明しました。コンポーネントの仕組みはAPI 1から現時点(API 29)までほぼ変わっていません。アプリ開発の基本となるので、正しく理解しておきましょう。
次回までの宿題
Androidアプリでよく用いられるViewはどのようなものがあるか調べてみましょう。