システムブート時のサービス実行のスケジュール方法

システムの起動時に自動的にアラームサービスに処理のスケジューリングを設定できると便利な場合があります。

例えば、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>

システムブート時にサービスの実行がスケジュールされる

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Android 開発入門