AlarmManager實現定時功能
阿新 • • 發佈:2018-12-23
實現定時間隔功能
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,提交註冊後會覆蓋上一個註冊。