一、用于設(shè)置定時的兩種方法 AlarmManager 與 WorkManager 他們之間的兩者區(qū)別
AlarmManager會使設(shè)備從低電耗中喚醒。而WorkManager更適合執(zhí)行一次性或周期性不精準的后臺工作,它是無法從低電耗中喚醒。適合替代所有舊版 Android 后臺調(diào)度 API(包括 FirebaseJobDispatcher、GcmNetworkManager 和 JobScheduler)的組件。
結(jié)論:精準鬧鈴還是需要基于AlarmManager實現(xiàn)
二、如何使用AlarmManager實現(xiàn)精準鬧鐘
if (Build.VERSION.SDK_INT >= 23) {
alarm.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,time,sender);
}else if (Build.VERSION.SDK_INT >= 19) {
alarm.setExact(AlarmManager.RTC_WAKEUP, time, sender);
} else {
alarm.setRepeating(AlarmManager.RTC_WAKEUP, time, AlarmManager.INTERVAL_DAY, sender);
}
代碼中關(guān)鍵是要使用setExactAndAllowWhileIdle 與 setExact 才能實現(xiàn)精準響鈴,下面先介紹下它們之間的區(qū)別
三、 setExactAndAllowWhileIdle 、 setExact與setRepeating的區(qū)別
setExact()和setExactAndAllowWhileIdle()都是AlarmManager類中的方法,用于設(shè)置一次性的精確鬧鐘12。他們的主要區(qū)別在于設(shè)備的休眠狀態(tài)。
* setExact():當(dāng)設(shè)備處于休眠狀態(tài)時,該方法設(shè)置的鬧鐘可能不會準時觸發(fā)12。
* setExactAndAllowWhileIdle():即使設(shè)備處于休眠狀態(tài),該方法設(shè)置的鬧鐘也會準時觸發(fā)342。
這兩個方法都需要應(yīng)用具有SCHEDULE_EXACT_ALARM權(quán)限1。如果你的應(yīng)用需要在特定時間執(zhí)行某個操作,你需要請求SCHEDULE_EXACT_ALARM權(quán)限。
可以看到 在安卓12及以上系統(tǒng)中 要使用setExact 與setExactAndAllowWhileIdle的關(guān)鍵都在于SCHEDULE_EXACT_ALARM 這個權(quán)限。
四、 什么是SCHEDULE_EXACT_ALARM權(quán)限
Android12引入了SCHEDULE_EXACT_ALARM權(quán)限進行"鬧鐘和提醒"功能的授權(quán)管理,開啟此權(quán)限才能實現(xiàn)精準響鈴的方法。否則會被系統(tǒng)拋出異常。

跳轉(zhuǎn)此開關(guān)頁面的代碼如下:
Uri uri = Uri.parse("package:"+context.getPackageName());
Intent i = new Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM,uri);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
驗證權(quán)限是否開啟代碼如下:
AlarmManager alarmManager=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
boolean hasPermission = alarmManager.canScheduleExactAlarms();//true:有權(quán)限,false:沒有權(quán)限
return hasPermission;
清單文件中需聲明此權(quán)限:
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>
以上都是安卓12中的要求。而到了安卓13有了一些新的變化。
五、安卓13 精準響鈴權(quán)限的變化,引入了新的權(quán)限
USE_EXACT_ALARM
USE_EXACT_ALARM 是自動授予的受限權(quán)限。用戶無法撤銷此權(quán)限。由于此權(quán)限是受限權(quán)限,因此請求此受限權(quán)限的應(yīng)用程序?qū)⒔邮軐彶椋切┎环峡山邮苡美龢藴实膽?yīng)用程序?qū)⒈唤乖?Google Play 上發(fā)布。
自動授予的含義是具體指舉個例子:清單文件中不配置USE_EXACT_ALARM,alarmManager.canScheduleExactAlarms() 判斷此開關(guān)的方法返回值由 “鬧鐘和提醒” 開關(guān)控制。如果USE_EXACT_ALARM了,則默認就是開,即便“鬧鐘和提醒”開關(guān)是關(guān),canScheduleExactAlarms() 也是開的狀態(tài)。而此時 清單文件中配置 SCHEDULE_EXACT_ALARM與否 只是用來控制開關(guān)按鈕是否可以點擊,但不論開關(guān)與否alarmManager.canScheduleExactAlarms()都是開
六、安卓14 精準響鈴權(quán)限變化
USE_EXACT_ALARM默認是關(guān)
如果理解了上面在安卓13中的變化 那么14中的變化 就是這個默認值是開變?yōu)榱岁P(guān),需要判斷并手動讓用戶開啟才行。
七、最后總結(jié)一下
SCHEDULE_EXACT_ALARM與USE_EXACT_ALARM權(quán)限的我別
Android12引入了SCHEDULE_EXACT_ALARM權(quán)限進行"鬧鐘和提醒"功能的授權(quán)管理。Android13則又引入了新的鬧鐘權(quán)限USE_EXACT_ALARM。
和Android12的SCHEDULE_EXACT_ALARM權(quán)限不同,如果App已經(jīng)申請使用了USE_EXACT_ALARM新權(quán)限,那么用戶是不能在設(shè)置頁面里關(guān)閉授權(quán)的。
對于日程管理、時間管理等類型的App來講,Android13引入的USE_EXACT_ALARM權(quán)限能夠帶來一定便利。相比Android12的SCHEDULE_EXACT_ALARM權(quán)限,使用新權(quán)限的應(yīng)用將不再需要頻繁打擾用戶進行授權(quán),能夠更高效地為用戶提供鬧鐘、日程提醒等服務(wù)。
不過,為了防止新權(quán)限被濫用,GooglePlay設(shè)置了嚴格的上架審核機制。開發(fā)者要注意,一旦使用了USE_EXACT_ALARM權(quán)限,App在上架GooglePlay時將會被平臺嚴格審查。除非App屬于鬧鐘、計時器、日歷等類型的應(yīng)用或者在已被列入到應(yīng)用市場的白名單里,否則GooglePlay將不會允許使用該權(quán)限的應(yīng)用上架。