システムブート時のサービス実行のスケジュール方法
システムの起動時に自動的にアラームサービスに処理のスケジューリングを設定できると便利な場合があります。
例えば、RSS のフィードを購読している場合は、アプリケーションを起動したタイミングで最新情報を取得するより、時々裏側で情報を最新にする処理を行っていてくれると RSS リーダーをひらいた時点でいつも最新情報が表示されるので便利です。
ここではそうしたことを実現するために、システムの起動時にサービスのスケジューリングを行う方法を示します。
システム起動時にサービス実行をスケジュールするには
システムが起動すると、標準ブロードキャスト (standard broadcast) として android.intent.action.BOOT_COMPLETED が一度だけ送られます。 このブロードキャストを受け取り、レシーバにてサービスの実行をスケジュールします。
こうすることで、システムをブートするたびにスケジュールが行われます。
ブロードキャストの利用とスケジューリングの一般的な方法については、AlarmService を利用したサービス実行のスケジューリング を参考にしてください。
尚、android.permission.RECEIVE_BOOT_COMPLETED パーミッションが必要です。
実装方法
BOOT_COMPLETED ブロードキャストレシーバの実装
一般的なブロードキャストレシーバと変わりありません。android.content.BroadcastReceiver から派生して onReceive メソッドを実装します。
package com.keicode.android.test;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class BootBroadcastReceiver extends BroadcastReceiver {
final static String TAG = "ServiceTest5";
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "scheduleService()");
Intent i = new Intent(context, MyIntentService.class);
PendingIntent pendingIntent
= PendingIntent.getService(
context, -1, i,
PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager
= (AlarmManager)
context.getSystemService(Context.ALARM_SERVICE);
alarmManager.setInexactRepeating(
AlarmManager.RTC,
System.currentTimeMillis(),
10000, pendingIntent);
}
}
ここでテスト用のサービスは単にログを行うだけの IntentService にしています。IntentService については「IntentService - 非同期、自動終了、キュー・・・便利なサービスの実装」を参考にしてください。
package com.keicode.android.test;
import android.app.IntentService;
import android.content.Intent;
import android.util.Log;
public class MyIntentService extends IntentService {
final static String TAG = "ServiceTest5";
public MyIntentService() {
super(TAG);
}
@Override
protected void onHandleIntent(Intent intent) {
Log.d(TAG, "onHandleIntent");
}
}
設定のキモ ~ AndroidManifest.xml
ここではアクティビティからレシーバーの登録を行うのではなく、マニフェスト (AndroidManifest.xml) に受け取るブロードキャストの種類とレシーバーのクラス名を記載します。
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.keicode.android.test"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />
<application
android:icon="@drawable/icon"
android:label="@string/app_name">
<service android:name=".MyIntentService"/>
<receiver android:name=".BootBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<category android:name="android.intent.category.HOME" />
</intent-filter>
</receiver>
</application>
</manifest>