網(wǎng)站首頁 編程語言 正文
定時任務(wù)
Timer不太適合那些需要長期在后臺運行的定時任務(wù),因為每個手機都有自己的休眠策略,Android手機長時間不操作就會導(dǎo)致Timer定時任務(wù)無法執(zhí)行,而Alarm具有喚醒CPU的功能,能保證大多數(shù)情況下,執(zhí)行定時任務(wù)的時候CPU能正常工作。
AlarmManager manager= (AlarmManager) getSystemService(Context.ACTIVITY_SERVICE);
PendingIntent pendingIntent;
/**
* SystemClock.elapsedRealtime():獲取到系統(tǒng)開機至今所經(jīng)歷的毫秒數(shù)
* System.currentTimeMillis():1970-1-1 0:00至今所經(jīng)歷的毫秒數(shù)
*
* ELAPSED_REALTIME:定時任務(wù)觸發(fā)從系統(tǒng)開機算起 但不喚醒CPU
* ELAPSED_REALTIME_WAKEUP:定時任務(wù)觸發(fā)從系統(tǒng)開機算起 喚醒CPU
* RTC:從1970-1-1 0:00算起 不喚醒CPU
* RTC_WAKEUP:從1970-1-1 0:00算起 喚醒CPU
*/
/**pendIntent:一般會調(diào)用getSrervice或getBroadCast
來獲取一個能夠執(zhí)行服務(wù)或廣播的pendingIntent,
這樣才能保證在任務(wù)被觸發(fā)的時候,
服務(wù)里的onStartCommand()和onRecive()方法被執(zhí)行
*/
long time= SystemClock.elapsedRealtime()+10*1000;//10秒鐘后執(zhí)行任務(wù)
manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,time,pendingIntent);
那么要實現(xiàn)一個長時間在后臺定時運行的服務(wù)該怎么做?
創(chuàng)建一個MyService類
package com.example.test;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.SystemClock;
import androidx.annotation.Nullable;
public class MyService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(new Runnable() {
@Override
public void run() {
//TODO
}
}).start();
AlarmManager manager= (AlarmManager) getSystemService(ALARM_SERVICE);
int time=60*60*1000;//一小時
long triggerAtTime= SystemClock.elapsedRealtime()+time;
Intent intent1=new Intent(this,MyService.class);
PendingIntent pendingIntent=PendingIntent.getService(this,0,intent1,0);
manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,triggerAtTime,pendingIntent);
return super.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ù)
<service android:name=".MyService"/>
在使用的地方調(diào)用下面代碼就可以。
Intent intent=new Intent(context,MyService.class);
context.startService(intent);
但是在Android4.4后,定時任務(wù)變得不準(zhǔn)確,會延時一段時間才能執(zhí)行,那是因為系統(tǒng)在耗電方面進(jìn)行的優(yōu)化,系統(tǒng)會檢測有多少Alarm任務(wù)存在,將觸發(fā)時間相近的幾個任務(wù)放在一起執(zhí)行,這樣可以大幅度的減少CPU被喚醒的次數(shù),演唱電池的使用時長。也可以使用setExact()來代替set()方法,可以保證任務(wù)能夠準(zhǔn)時執(zhí)行。
Doze模式
如果設(shè)備未充電,并處于靜止?fàn)顟B(tài),且屏幕關(guān)閉了一段時間后,就能進(jìn)入到Doze模式。
在Doze模式下,系統(tǒng)會對CPU、網(wǎng)絡(luò)、Alarm等活動進(jìn)行限制,從而延長電池的使用壽命。當(dāng)然,系統(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ù)會變得相當(dāng)不準(zhǔn),當(dāng)然這種情況下對Alarm的要求也并不高,如果有特殊的要求,調(diào)用AlarmManager的setAndAllowWhileIdle()或者setExactAndAllowWhileIdle()方法就能讓定時任務(wù)正常執(zhí)行,和set()與setExact()的區(qū)別是一樣的。
原文鏈接:https://blog.csdn.net/m0_56366502/article/details/127559760
相關(guān)推薦
- 2022-09-23 C/C++中的靜態(tài)變量注意事項_C 語言
- 2023-10-16 微信小程序瀏覽docx,pdf等文件在線預(yù)覽使用wx.openDocument
- 2023-04-27 python請求域名requests.(url?=?地址)報錯_python
- 2022-09-12 python?通過dict(zip)和{}的方式構(gòu)造字典的方法_python
- 2022-05-31 python應(yīng)用之如何使用Python發(fā)送通知到微信_python
- 2022-08-14 hyper-v如何配置NAT網(wǎng)絡(luò)的實現(xiàn)_Hyper-V
- 2022-09-20 C#?Winform實現(xiàn)圓角無鋸齒按鈕_C#教程
- 2022-12-08 oracle自動生成uuid的實現(xiàn)方法_oracle
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支