2012年2月27日

【Android】AlarmManagerを使ってアプリを指定時刻に起動

今回はタイマー機能の解説を少々。

私もあんまり分かりませんので、分かる範囲での解説です。

PendingIntentとかそんなん出てきます。

まずはIntentの登録方法。
指定時刻に起動するIntentをAlarmManagerに登録します。

ActivitySetAlarm.java

public class ActivitySetAlarm extends Activity {
 private static final int REQUEST_CODE = 0;
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  // ActivityAlarmReceiverから来た場合の判定
  Intent intent = getIntent();
  if (intent != null && intent.getAction().equals("received")) {
   // do something here
  } else {
   // do something here
  }
 }

 /**
  * 1分後に起動するようにPendingIntentを登録する
  */
 public void setSchedule() {
  // ActivityAlarmReceiverを呼び出すインテントを作成
  Intent i = new Intent(getApplicationContext(),
    ActivityAlarmReceiver.class);
  i.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
  // ブロードキャストを投げるPendingIntentの作成
  PendingIntent sender = PendingIntent.getBroadcast(
    ActivitySetAlarm.this, REQUEST_CODE, i,
    PendingIntent.FLAG_UPDATE_CURRENT);

  // Calendarの作成
  Calendar calendar = Calendar.getInstance();
  // 1分後に起動するように登録
  calendar.add(Calendar.MINUTE, -1);
  // AlramManager取得
  AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
  // AlramManagerにPendingIntentを登録
  am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);
 }

 /**
  * PandingIntentの登録を解除する
  */
 public void removeSchedule() {
  // ActivityAlarmReceiverを呼び出すインテントを作成
  Intent i = new Intent(getApplicationContext(),
    ActivityAlarmReceiver.class);
  // ブロードキャストを投げるPendingIntentの作成
  PendingIntent sender = PendingIntent.getBroadcast(
  ActivitySetAlarm.this, REQUEST_CODE, i,
  PendingIntent.FLAG_UPDATE_CURRENT);
  // AlarmManager取得
  AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
  // PendingIntentをキャンセル
  am.cancel(sender);
 }
}

受け取る方の作成

ActivityAlarmReceiver.java

public class ActivityAlarmReceiver extends BroadcastReceiver {
 // notifications
 @Override
 public void onReceive(Context context, Intent data) {
  Intent intent = new Intent(context, ActivitySetAlarm.class);
  intent.setAction("received");
  PendingIntent pIntent = PendingIntent.getActivity(context, 0, intent, 0);
  try {
   pIntent.send();
  } catch(Exception e){
   Log.e(TAG, e.getMessage(), e);
  }
 }
}

最後にAndroid Manifest.xmlにreceiverを登録して完了
<receiver
 android:name=".ActivityAlarmReceiver"
 android:process=":remote" />