2011-07-14

在 Android 裡使用一次性鬧鐘(AlarmManager)

設定鬧鐘:
Calendar cal = Calendar.getInstance();
cal.add(Calendar.SECOND, 30);
Log.d(TAG, "設定鬧終於30秒後: " + cal);

Intent intent = new Intent(this.ctx, TestReceiver.class);
intent.putExtra("msg", "傳訊息給鬧鐘");

PendingIntent pi = PendingIntent.getBroadcast(this.ctx, 1, intent, PendingIntent.FLAG_ONE_SHOT);

AlarmManager am = (AlarmManager) this.ctx.getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pi);
這裡的 PendingIntent 除了可以用 Broadcast 以外,還可以用 Activity 和 Service。
PendingIntent.getActivity(...);
PendingIntent.getService(...);
使用 PendingIntent 傳送 Broadcast 的效果如同 Context.sendBroadcast(...)。

使用 AlarmManager.RTC_WAKEUP 可以叫醒待機中的 Android,也可以使用 AlarmManager.RTC 表示等 Android 醒來後才執行鬧鐘。

30秒後鬧鐘呼叫 TestReceiver.class:
public class TestReceiver extends BroadcastReceiver {

    private static final String TAG = "TestReceiver";

    @Override
    public void onReceive(Context ctx, Intent intent) {
        Log.d(TAG, intent.toString());
        String msg = intent.getStringExtra("msg");
        Log.d(TAG, msg);
    }
}
最後在 Manifest 裡定義 receiver 就完成了。
<receiver android:name=".TestReceiver" />

沒有留言:

張貼留言