システムの起動時にサービスを実行する


今回はシステムの起動時にサービスを実行する方法を説明します。

正確にはサービスを実行するということに限ったことではなく、システムの起動時に何かしらの処理を行うということです。
しかし「常駐アプリを作りたい」など、起動時に特定のServiceを実行したいという場面が出てくると思うのでこのようなタイトルにしました。

それでは続きで説明していきます。

BroadCast Intent

システムに存在するアプリケーション全てに対してIntentを投げるブロードキャストIntentというものがあります。

システムが発行するブロードキャストIntentには下記のようなものがあります。

Broadcast Intent

Intent名 内容
ACTION_AIRPLANE_MODE_CHANGED 機内モードが設定/解除された
ACTION_BATTERY_CHANGED バッテリー残量が変化した
ACTION_BATTERY_LOW バッテリー残量が非常に少なくなった
ACTION_BATTERY_OKAY バッテリー残量が非常に少ない状態から復帰した
ACTION_BOOT_COMPLETED システムの起動が完了した
ACTION_CAMERA_BUTTON カメラボタンが押下された
ACTION_CLOSE_SYSTEM_DIALOGS システムダイアログが閉じられた
ACTION_CONFIGURATION_CHANGED ロケールなどシステムの設定が変更された
ACTION_DATE_CHANGE_ACTION 日付が変更された
ACTION_DEVICE_STORAGE_LOW 内蔵メモリが非常に少ない状態になった
ACTION_DEVICE_STORAGE_OK 内蔵メモリが非常に少ない状態から復帰した
ACTION_GTALK_SERVICE_CONNECTED GoogleTalkのセッションが確立された
ACTION_GTALK_SERVICE_DISCONNECTED GoogleTalkのセッションが閉じられた
ACTION_HEADSET_PLUG ヘッドセットの抜き差しが行われた
ACTION_INPUT_METHOD_CHANGED IMEが変更された
ACTION_POWER_CONNECTED 外部電源が接続された
ACTION_POWER_DISCONNECTED 外部電源が切断された

この表は一部ですので、詳細はhttp://developer.android.com/reference/android/content/Intent.htmlをご覧ください。

今回利用するのはシステムの起動完了時に発行されるandroid.intent.action.BOOT_COMPLETEDです。

ブロードキャストレシーバ

ブロードキャストインテントはブロードキャストレシーバ(BroadcastReceiver)で受信します。

BroadcastReceiverクラスを継承したクラスを用意します。そしてonReceiveメソッドをオーバーライドし、そこで起動時に行いたい処理を記述します。
下記では常駐させたいサービス○○Serviceを起動するIntentを発行しています。

public class StartupReceiver extends BroadcastReceiver{
	@Override
	public void onReceive(Context context, Intent intent) {
			Intent serviceIntent = new Intent(context, ○○Service.class);
			context.startService(serviceIntent);
	}
}

インテントを受け取る許可

注意事項として、インテントを受け取るパーミッションの設定を忘れずにマニフェストファイルに記述する必要があります。合わせてIntentフィルターも設定します。

用意したレシーバ(今回はStartupReceiver)がandroid.intent.action.BOOT_COMPLETEDを受け取るということを明示する必要があります。applicationタグ内に記述します。

<receiver android:name=".StartupReceiver" android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
	<intent-filter>
  		<action android:name="android.intent.action.BOOT_COMPLETED" />
  		<category android:name="android.intent.category.DEFAULT" />
	</intent-filter>
</receiver>
One Comment