システムの起動時にサービスを実行する
今回はシステムの起動時にサービスを実行する方法を説明します。
正確にはサービスを実行するということに限ったことではなく、システムの起動時に何かしらの処理を行うということです。
しかし「常駐アプリを作りたい」など、起動時に特定の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>