Androidで常駐プロセス(deamon)みたいな事をするには、Serviceを利用しますが、指定した時間にアプリケーションを起動したい時は、AlarmManagerを使用します。

AlarmManager API ドキュメント

主なメソッド数は以下の3種類となります。

  • 指定した時間に指定したPendingIntentを起動
  • 指定した間隔で指定したPendingIntentを起動
  • 指定たPendingIntentをキャンセルする。

起動する物としては、サービスやブロードキャストレシーバーが存在します。
また、AlarmManagerを使う上での注意事項もありますので順に記載していきたいと思います。

指定した時間にブロードキャストレシーバで受け取るプログラム

Broadcast送り側

Intent intent = new Intent(ctx, ReceiverIconChange.class);
intent.setAction(CALENDER_ICON_CHANGE);
PendingIntent sender = PendingIntent.getBroadcast(ctx, 0, intent, 0);
  AlarmManager am = (AlarmManager)(ctx.getSystemService(ALARM_SERVICE));
  
  // 翌日00:00:01の時間を設定
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(currentTime);
cal.add(Calendar.DATE, 1);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 1);
am.set(AlarmManager.RTC_WAKEUP,aTimerInMillis,sender);

上記サンプルでは、翌日の0時00分01秒ににReceiverIconChange#onReviceメソッドが呼ばれます。
パラメータは、必須ではありませんが、パラメータが必要な場合は、setActionや、putExtra等で通常のIntentと同じように指定可能です。

Broadcast受け取り側

public class ReceiverIconChange extends BroadcastReceiver {
 public void onReceive(Context ctx, Intent intent) {
String action = intent.getAction();
if (!CALENDER_ICON_CHANGE.equals(action)) {
// アイコン変更の要求でなかったら、終了
return;
}
   doSomething();
// 次ののAlarmを設定
  // 翌日00:00:01の時間を設定
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(currentTime);
cal.add(Calendar.DATE, 1);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 1);
am.set(AlarmManager.RTC_WAKEUP,aTimerInMillis,sender);
   }

setRepeatでは、ミリ秒毎に起動するBroadcastReceiverが指定できますが、setで設定できるのは、1回の起動のみです。従って上記のサンプルコードでは、BroadcastReceiver内で再度、AmarmManagerを使用して次回の起動登録を行っております。
doSomethingメソッド部分で実際にビジネスロジックを記述するわけですが、BroadcastReceiverでは、あまり重たい処理をすべきではありません。時間のかかる処理(ファイルのダウンロード等)や、UIを表示するような場合は、BroadcastReceiverで受け取るのではなく、Serviceを実装して受け取ります。

Manufestファイル

ブロードキャストレシーバーを使用する場合は、Manufestファイルへの記載も必要となります。


<receiver android:name=".ReceiverIconChange" >
<intent-filter>
<action android:name="jp.co.taosoftware.android.calendar.action.ICON_CHNAGE" />
</intent-filter>
</receiver>

非常に簡単なサンプルですが、これでcronのような動作をさせることが可能です。

注意事項としては、ドキュメントに書いてありますが、setを2回連続して呼んではいけません。(スレッド化している時は特に注意)かならず、cancelをしてから再設定してください。

実際2回連続でsetを読んで追ってみましたが、どうしようもない動きをしました。このあたりの動作は今後のOSのバージョンアップで変更になる可能性がありますので、私のようにあまり深入りしないのが良いでしょう。

サービスでの受け取り方や、その他注意事項に関しては次回に…

ブログ内の関連する記事