1. 程式人生 > >AlarmManager實現定時功能

AlarmManager實現定時功能

實現定時間隔功能

1.傳送

 AlarmManager alarmService = (AlarmManager) context.getSystemService(ALARM_SERVICE);
        Intent alarmIntent = new Intent(context, ScreenControlAlarmReceiver.class).setAction("intent_alarm_log");
        PendingIntent broadcast = PendingIntent.getBroadcast(context, 0, alarmIntent, 0
);//通過廣播接收 alarmService.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + INTERVAL, broadcast);//INTERVAL毫秒後觸發

set有三個引數:

第一個引數表示鬧鐘型別:AlarmManager.RTC_WAKEUP表示使用當前系統的絕對時間,那麼第二個引數觸發時間也是精確的絕對時間。其他在文章最後介紹。

第二個引數表示為觸發時間:可以是當前時間新增你的延遲時間System.currentTimeMillis() + INTERVAL,表示INTERVAL毫秒時間後進行觸發。

第三個引數表示為觸發時間:可以是當前時間新增你的延遲時間System.currentTimeMillis() + INTERVAL,表示INTERVAL毫秒時間後進行觸發。

2.註冊ScreenControlAlarmReceiver接收觸發:

public class ScreenControlAlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
       //你的邏輯處理
        //如果需要實現間隔定時器功能,在重新執行1的傳送步驟,實現間隔定時,間隔時間為INTERVAL
} //xml註冊 <receiver android:name=".ScreenControlAlarmReceiver"> <intent-filter> <action android:name="intent_alarm_log"/> </intent-filter>

3.取消鬧鐘
只需要取消同一個PendingIntent 即可。

 AlarmManager alarmService = (AlarmManager) context.getSystemService(ALARM_SERVICE);
        Intent alarmIntent = new Intent(context, ScreenControlAlarmReceiver.class).setAction("intent_alarm_log");
        PendingIntent broadcast = PendingIntent.getBroadcast(context, 0, alarmIntent, 0);
        alarmService.cancel(broadcast);

在精確時間定時觸發

有時候需要定時精確時刻,比如今天下午定時16:51:00觸發執行操作:

        Calendar instance = Calendar.getInstance();
        instance.set(Calendar.HOUR_OF_DAY, 16);//小時
        instance.set(Calendar.MINUTE, 51);//分鐘
        instance.set(Calendar.SECOND, 0);//秒

        AlarmManager alarmService = (AlarmManager) context.getSystemService(ALARM_SERVICE);
        Intent alarmIntent = new Intent(context, ScreenControlAlarmReceiver.class).setAction("intent_alarm_log");
        PendingIntent broadcast = PendingIntent.getBroadcast(context, 0, alarmIntent, 0);//通過廣播接收
        alarmService.set(AlarmManager.RTC_WAKEUP, instance.getTimeInMillis() , broadcast);

其他引數介紹

第一個引數:

public class AlarmManager {
     //在系統精確時間觸發,會喚醒cpu
    public static final int RTC_WAKEUP = 0;

     //在系統精確時間觸發,裝置休眠不喚醒不觸發
    public static final int RTC = 1;

     //系統從啟動到現在的A毫秒時間(包括深度睡眠的時間)後觸發,A應該就是第二個引數
    public static final int ELAPSED_REALTIME_WAKEUP = 2;

     //統從啟動到現在的A毫秒時間(包括深度睡眠的時間)後觸發,A應該就是第二個引數
     //系統休眠時不會喚醒cpu,也就不會觸發
    public static final int ELAPSED_REALTIME = 3;

第二個引數:
如果第一個引數指定是在精確時間觸發,那個第二個引數也需要指定的是精確時間。如果如果第一個引數指定是啟動到現在的相對時間,那個第二個引數應該是這個相對時間

出現的坑記錄:
1.sdk19及以後,會出現時間不准問題,可以使用setExact方法。
2.同一個action,提交註冊後會覆蓋上一個註冊。