Android精準鬧鐘 API12~14機制調(diào)研

一、用于設(shè)置定時的兩種方法 AlarmManager 與 WorkManager 他們之間的兩者區(qū)別

AlarmManager會使設(shè)備從低電耗中喚醒。而WorkManager更適合執(zhí)行一次性或周期性不精準的后臺工作,它是無法從低電耗中喚醒。適合替代所有舊版 Android 后臺調(diào)度 API(包括 FirebaseJobDispatcher、GcmNetworkManagerJobScheduler)的組件。

結(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)拋出異常。

image.png

跳轉(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_ALARMUSE_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)用上架。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容