AndroidDoze模式下Alarm定時任務(wù)實現(xiàn)流程詳解_第1頁
AndroidDoze模式下Alarm定時任務(wù)實現(xiàn)流程詳解_第2頁
AndroidDoze模式下Alarm定時任務(wù)實現(xiàn)流程詳解_第3頁
AndroidDoze模式下Alarm定時任務(wù)實現(xiàn)流程詳解_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第AndroidDoze模式下Alarm定時任務(wù)實現(xiàn)流程詳解目錄定時任務(wù)Doze模式

定時任務(wù)

Timer不太適合那些需要長期在后臺運行的定時任務(wù),因為每個手機都有自己的休眠策略,Android手機長時間不操作就會導(dǎo)致Timer定時任務(wù)無法執(zhí)行,而Alarm具有喚醒CPU的功能,能保證大多數(shù)情況下,執(zhí)行定時任務(wù)的時候CPU能正常工作。

AlarmManagermanager=(AlarmManager)getSystemService(Context.ACTIVITY_SERVICE);

PendingIntentpendingIntent;

*SystemClock.elapsedRealtime():獲取到系統(tǒng)開機至今所經(jīng)歷的毫秒數(shù)

*System.currentTimeMillis():1970-1-10:00至今所經(jīng)歷的毫秒數(shù)

*ELAPSED_REALTIME:定時任務(wù)觸發(fā)從系統(tǒng)開機算起但不喚醒CPU

*ELAPSED_REALTIME_WAKEUP:定時任務(wù)觸發(fā)從系統(tǒng)開機算起喚醒CPU

*RTC:從1970-1-10:00算起不喚醒CPU

*RTC_WAKEUP:從1970-1-10:00算起喚醒CPU

/**pendIntent:一般會調(diào)用getSrervice或getBroadCast

來獲取一個能夠執(zhí)行服務(wù)或廣播的pendingIntent,

這樣才能保證在任務(wù)被觸發(fā)的時候,

服務(wù)里的onStartCommand()和onRecive()方法被執(zhí)行

longtime=SystemClock.elapsedRealtime()+10*1000;//10秒鐘后執(zhí)行任務(wù)

manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,time,pendingIntent);

那么要實現(xiàn)一個長時間在后臺定時運行的服務(wù)該怎么做?

創(chuàng)建一個MyService類

packagecom.example.test;

importandroid.app.AlarmManager;

importandroid.app.PendingIntent;

importandroid.app.Service;

importandroid.content.Intent;

importandroid.os.IBinder;

importandroid.os.SystemClock;

importandroidx.annotation.Nullable;

publicclassMyServiceextendsService{

@Nullable

@Override

publicIBinderonBind(Intentintent){

returnnull;

@Override

publicintonStartCommand(Intentintent,intflags,intstartId){

newThread(newRunnable(){

@Override

publicvoidrun(){

//TODO

}).start();

AlarmManagermanager=(AlarmManager)getSystemService(ALARM_SERVICE);

inttime=60*60*1000;//一小時

longtriggerAtTime=SystemClock.elapsedRealtime()+time;

Intentintent1=newIntent(this,MyService.class);

PendingIntentpendingIntent=PendingIntent.getService(this,0,intent1,0);

manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,triggerAtTime,pendingIntent);

returnsuper.onStartCommand(intent,flags,startId);

}

可以看到先創(chuàng)建了一個子線程在這里執(zhí)行具體的操作任務(wù),然后就是alarm機制,定義任務(wù)觸發(fā)一小時后,再使用PendingIntent指定定時處理任務(wù)的MyService,最后調(diào)用set方法設(shè)定完成。

這樣就將一個長時間在后臺定時運行的服務(wù)設(shè)定成功了,一旦啟動了MyService,就會在onStartCommand()方法里設(shè)定一個定時任務(wù),這樣一小時后將會再次啟動MyService,每隔一小時就會執(zhí)行一次。

然后去使用,在manifest文件中注冊服務(wù)

serviceandroid:name=".MyService"/

在使用的地方調(diào)用下面代碼就可以。

Intentintent=newIntent(context,MyService.class);

context.startService(intent);

但是在Android4.4后,定時任務(wù)變得不準確,會延時一段時間才能執(zhí)行,那是因為系統(tǒng)在耗電方面進行的優(yōu)化,系統(tǒng)會檢測有多少Alarm任務(wù)存在,將觸發(fā)時間相近的幾個任務(wù)放在一起執(zhí)行,這樣可以大幅度的減少CPU被喚醒的次數(shù),演唱電池的使用時長。也可以使用setExact()來代替set()方法,可以保證任務(wù)能夠準時執(zhí)行。

Doze模式

如果設(shè)備未充電,并處于靜止狀態(tài),且屏幕關(guān)閉了一段時間后,就能進入到Doze模式。

在Doze模式下,系統(tǒng)會對CPU、網(wǎng)絡(luò)、Alarm等活動進行限制,從而延長電池的使用壽命。當然,系統(tǒng)并不會一直處于Doze模式,而是會間歇性地退出Doze模式一小段時間,在這段時間中,應(yīng)用就可以去完成它的同步操作、Alarm任務(wù)等。

Doze模式下受限制的功能:

網(wǎng)絡(luò)訪問被禁止。系統(tǒng)忽略喚醒CPU或者屏幕操作。系統(tǒng)不再執(zhí)行WIFI掃描。系統(tǒng)不再執(zhí)行同步服務(wù)。Alarm任務(wù)將會在下次退出Doze模式的時候執(zhí)行。

在Doze模式下,Alarm任務(wù)會

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論