Android之AlarmManager
雖然Timer、Handler.postDelayed、Thread.sleep方法也可以實現定時任務,但當系統處於休眠狀態時,這些定時任務所在程式會被暫停,甚至app被進行垃圾回收,這就意味定時任務將失效。AlarmManager可以幫忙解決這一問題。
AlarmManager(定時管理器)作用:定時喚醒系統(即使休眠狀態下)執行任務,相比上述方法,更加節省電池耗電量。
先來一個demo,學習AlarmManager的用法:
1、新建一個DaemonService類:
// 獲取系統提供的AlarmManager物件
AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(
this, // context:上下文
0, // requestCode:intent請求標記
new Intent("COM.TEST.NOTIFY_ACTION"), // intent:需要廣播出去的intent
PendingIntent.FLAG_UPDATE_CURRENT // flag:intent的控制標籤。update_current:新intent覆蓋更新舊的未處理的intent;
);
// 設定3分鐘重複一次
alarm.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 3000, pendingIntent);
2、在MainActivity註冊一下BroadcastReceiver
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 註冊一個接收器,專門處理定時任務發過來的intent
alarmReceiver = new AlarmReceiver();
filter = new IntentFilter();
filter.addAction("COM.TEST.NOTIFY_ACTION");
registerReceiver(alarmReceiver, filter);
startService(new Intent(this, DaemonService.class));
}
3、自定義類:AlarmReceiver,處理廣播
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
try {
// 寫上定時任務內容 TODO
} catch (Exception e) {}
}
}
step 1 介面引數詳解:
- int type
AlarmManager.RTC_WAKEUP:值為0,表示鬧鐘在睡眠狀態下會喚醒系統並執行提示功能,該狀態下鬧鐘使用絕對時間(即當前系統時間)
AlarmManager.RTC:值為1,表示鬧鐘在睡眠狀態下不可用,該狀態下鬧鐘使用絕對時間
AlarmManager.ELAPSED_REALTIME_WAKEUP:值為2,表示鬧鐘在睡眠狀態下會喚醒系統並執行提示功能,該狀態下鬧鐘也使用相對時間(相對於系統啟動開始)
AlarmManager.ELAPSED_REALTIME:值為3,表示鬧鐘在手機睡眠狀態下不可用,該狀態下鬧鐘使用相對時間。
AlarmManager.POWER_OFF_WAKEUP:值為4,表示鬧鐘在手機關機狀態下也能正常進行提示功能,用得最多的狀態之一,該狀態下鬧鐘也是用絕對時間;不過本狀態好像受SDK版本影響,某些版本並不支援 -
ps:1、RTC = Real Time Clock 當前系統的實時時鐘
2、RTC鬧鐘和ELAPSED_REALTIME 最大的差別就是前者可以通過修改手機時間觸發鬧鐘事件,
後者要通過真實時間的流逝,即使在休眠狀態,時間也會被計算。
- long triggerAtMillis : 鬧鐘第一次執行時間,毫秒為單位,需與第一個type引數匹配,
- 如果是RTC型別,triggerAtMillis 則一般使用System.currentTimeMillis();
- 如果是ELAPSED型別,triggerAtMillis 則一般使用SystemClock.elapsedRealtime();
- long intervalMillis : 兩次鬧鐘執行間隔
- PendingIntent operation : 任務的執行動作,傳送廣播,啟動activity,啟動service
參考:
https://www.jianshu.com/p/32f438a0c239
https://blog.csdn.net/wei_chong_chong/article/details/51258336
相關文章
- Android之android exported="false"作用AndroidExportFalse
- Android之StrictModeAndroid
- Android之BroadcastReceiverAndroidAST
- Android之FragmentAndroidFragment
- android開發 之 Bolts-AndroidAndroid
- Android之Material DesignAndroidMaterial Design
- Android Jetpack 之 LiveDataAndroidJetpackLiveData
- Android Jetpack之ViewModelAndroidJetpackView
- Android IPC 之AIDLAndroidAI
- Android Jetpack 之 LifecycleAndroidJetpack
- Android Jetpack 之 ViewModelAndroidJetpackView
- Android之動畫Android動畫
- Android之Service設定android:process作用Android
- Android API開發之OpenGL開發之Android OpenGL STL詳解AndroidAPI
- Android之Zygote介紹AndroidGo
- Android之APP保活AndroidAPP
- Android之Apk加殼AndroidAPK
- Android修煉之混淆Android
- Android之Window與WindowManagerAndroid
- Android之exif格式 ExifInterfaceAndroid
- Android之Activity全面解析Android
- Android JNI 之 Bitmap 操作Android
- Android之adb的使用Android
- 再學Android之WebViewAndroidWebView
- Android 基礎之 HandlerAndroid
- Android之Notification和RemoteviewAndroidREMView
- Android 之Service使用攻略Android
- Android TextView 富文字之 android.text.style.xxxSpanAndroidTextView
- 深入理解Android 之 Activity啟動流程(Android 10)Android
- (連載)Android 8.0 : Android虛擬機器之JNIAndroid虛擬機
- Android面試題之Android中的設計模式Android面試題設計模式
- Android之訊息推送原理Android
- Android音視訊之AudioRecordAndroid
- Android Architecture Components 之 Room 篇AndroidOOM
- Android之string.valueOf妙用Android
- Android 效能分析工具之TraceViewAndroidView
- Android之Mina框架學習Android框架
- Android之重新簽名APKAndroidAPK