精確鬧鐘是針對使用者需求或需要在確切時間發生的操作所設計的通知。
Android 12 為應用程式推出的 SCHEDULE_EXACT_ALARM
權限可設定精確鬧鐘時間,而不再預先授予以 Android 13 為目標版本所安裝的最新應用程式 (依預設將設為拒絕)。如果使用者透過備份與還原作業,將應用程式資料轉移至執行 Android 14 的裝置,則權限仍會遭到拒絕。如果現有應用程式已有這項權限,則在裝置升級至 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
權限目前為遭拒狀態,並且需要使用者進行額外操作步驟才能授予權限,因此我們強烈建議開發人員評估用途,並確認其用途是否需要真的需要精確鬧鐘。
以下列出不需要精確鬧鐘的常見工作流程:
- 在應用程式的生命週期中安排週期性工作
- 如果工作需要記住實時限制 (例如:在明天下午 2 點或在 30 分鐘後結束),則
set()
是非常實用的方法。否則,建議使用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
權限。
測試規範
如要測試這項變更,請從系統設定的「特殊應用程式存取權」頁面,停用應用程式的「鬧鐘與提醒」權限 (設定 > 應用程式 > 特殊應用程式存取權 > 鬧鐘與提醒),然後觀察應用程式的行為是否有所改變。