精確鬧鐘是針對使用者需求或需要執行的操作 發生在精確的時間點
SCHEDULE_EXACT_ALARM
,這是 Android 12 中為應用程式引進的權限,
排定精確鬧鐘,不再預先授予新安裝
指定 Android 13 以上版本的應用程式 (預設為拒絕)。如果
使用者透過
備份和還原作業,但權限仍會遭拒。如果
現有應用程式已具備這項權限,系統會在裝置
升級至 Android 14
必須具備 SCHEDULE_EXACT_ALARM
權限,才能啟動精確鬧鐘
透過下列 API,否則系統將擲回 SecurityException
:
SCHEDULE_EXACT_ALARM
權限的現行最佳做法仍為
的相關規定,包括:
- 安排時間之前,請先與
canScheduleExactAlarms()
確認權限 精確鬧鐘 - 設定應用程式,以便監聽前景廣播內容並做出適當回應
AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED
、 ,系統會在使用者授予權限時傳送。
受影響的應用程式
如果裝置搭載 Android 14 以上版本,將會影響新的 已安裝且具備下列特性的應用程式:
- 以 Android 13 (API 級別 33) 以上版本為目標版本。
- 在資訊清單中宣告
SCHEDULE_EXACT_ALARM
權限。 - 不屬於豁免或預先授權 情境。
- 不是日曆或鬧鐘時鐘應用程式。
日曆和鬧鐘應用程式應宣告 USE_EXACT_ALARM
日曆或鬧鐘應用程式必須傳送日曆提醒、起床
鬧鐘或提醒。這些應用程式可以要求
USE_EXACT_ALARM
一般權限。USE_EXACT_ALARM
權限將
安裝時授予,擁有這項權限的應用程式就可以排定
設定精確鬧鐘,就像擁有 SCHEDULE_EXACT_ALARM
權限的應用程式一樣。
可能不需要精確鬧鐘的用途
因為 SCHEDULE_EXACT_ALARM
權限目前預設為拒絕。
授予權限的程序需要使用者進行額外步驟
強烈建議您評估其用途,並判斷是否精確鬧鐘
仍須符合其他用途
以下列出不需要精確鬧鐘的常見工作流程:
- 在應用程式的生命週期中安排週期性工作
- 如果工作需要保持即時更新,
set()
方法就非常實用 例如明天下午 2:00 或 30 分鐘後 否則,建議使用postAtTime()
或postDelayed()
方法。 - 排定的背景作業,例如:更新應用程式和上傳記錄檔
WorkManager
可讓您安排具時效性的定期工作。 您可以提供重複間隔和彈性間隔 (至少 15 分鐘), 為工作定義精細的執行階段- 當系統處於閒置狀態時,需要鬧鐘在約略時間過後響起
- 請使用非精準鬧鐘。具體來說,請呼叫
setAndAllowWhileIdle()
。 - 在特定時間後所應採取的使用者指定動作
- 請使用非精準鬧鐘。具體來說,請呼叫
set()
。 - 指定時限內可以進行的使用者指定動作
- 請使用非精準鬧鐘。具體來說,請呼叫
setWindow()
。請注意, 允許的最短時間間隔為 10 分鐘。
繼續使用精確鬧鐘的遷移步驟
應用程式至少必須先檢查是否有權限 排定確切的鬧鐘時間如果應用程式不具備權限,就必須提出要求 來回應使用者的需求
- 應用程式應呼叫
AlarmManager.canScheduleExactAlarms()
進行確認 取得適當權限 如果應用程式未具備權限,請叫用含有
ACTION_REQUEST_SCHEDULE_EXACT_ALARM
,與應用程式套件 以要求使用者授予權限。您可以在下列項目的
onResume()
方法中查看使用者的決定: 應用程式。監聽
AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED
敬上 。如果使用者已授予應用程式權限,應用程式就能明確設定 鬧鐘。如果使用者拒絕權限要求,請優雅降級 應用程式體驗,藉此為使用者提供 使用者也會無法存取受該權限保護的資訊。
下列程式碼片段說明如何檢查
SCHEDULE_EXACT_ALARM
權限:
val alarmManager: AlarmManager = context.getSystemService<AlarmManager>()!!
when {
// If permission is granted, proceed with scheduling exact alarms.
alarmManager.canScheduleExactAlarms() -> {
alarmManager.setExact(...)
}
else -> {
// Ask users to go to exact alarm page in system settings.
startActivity(Intent(ACTION_REQUEST_SCHEDULE_EXACT_ALARM))
}
}
用於檢查權限並處理使用者決定的程式碼範例
onResume()
:
override fun onResume() {
…
if (alarmManager.canScheduleExactAlarms()) {
// Set exact alarms.
alarmManager.setExact(...)
}
else {
// Permission not yet approved. Display user notice and revert to a fallback
// approach.
alarmManager.setWindow(...)
}
}
權限遭拒的優雅降級
部分使用者會拒絕授予權限。在這種情況下,我們建議 優雅淡化使用體驗,同時盡力提供 找出其用途,從而獲得可能的備用使用者體驗。
豁免資格
下列類型的應用程式一律可以呼叫 setExact()
或
setExactAndAllowWhileIdle()
方法:
- 使用平台憑證簽署的應用程式。
- 具備特殊權限的應用程式。
- 列入電源許可清單的應用程式 (如果您的應用程式符合上述規定,
提出要求時,可以使用
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
意圖動作)。
預先授權
- 「
SYSTEM_WELLBEING
」的角色持有者將預先獲得權限SCHEDULE_EXACT_ALARM
。
測試規範
如要測試這項變更,請停用鬧鐘與應用程式的提醒權限 從系統設定中的特殊應用程式存取權頁面 (設定 > 應用程式 >) 特殊應用程式存取權 >鬧鐘與提醒),然後觀察應用程式的行為。