根據預設,系統會拒絕排定精確鬧鐘

精確鬧鐘是針對使用者需求或需要執行的操作 發生在精確的時間點

SCHEDULE_EXACT_ALARM,這是 Android 12 中為應用程式引進的權限, 排定精確鬧鐘,不再預先授予新安裝 指定 Android 13 以上版本的應用程式 (預設為拒絕)。如果 使用者透過 備份和還原作業,但權限仍會遭拒。如果 現有應用程式已具備這項權限,系統會在裝置 升級至 Android 14

必須具備 SCHEDULE_EXACT_ALARM 權限,才能啟動精確鬧鐘 透過下列 API,否則系統將擲回 SecurityException

,瞭解如何調查及移除這項存取權。

SCHEDULE_EXACT_ALARM 權限的現行最佳做法仍為 的相關規定,包括:

受影響的應用程式

如果裝置搭載 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 分鐘。

繼續使用精確鬧鐘的遷移步驟

應用程式至少必須先檢查是否有權限 排定確切的鬧鐘時間如果應用程式不具備權限,就必須提出要求 來回應使用者的需求

這和提出特殊要求時的標準工作流程相同 權限

  1. 應用程式應呼叫 AlarmManager.canScheduleExactAlarms() 進行確認 取得適當權限
  2. 如果應用程式未具備權限,請叫用含有 ACTION_REQUEST_SCHEDULE_EXACT_ALARM,與應用程式套件 以要求使用者授予權限。

    您可以在下列項目的 onResume() 方法中查看使用者的決定: 應用程式。

  3. 監聽 AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED敬上 。

  4. 如果使用者已授予應用程式權限,應用程式就能明確設定 鬧鐘。如果使用者拒絕權限要求,請優雅降級 應用程式體驗,藉此為使用者提供 使用者也會無法存取受該權限保護的資訊。

下列程式碼片段說明如何檢查 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 意圖動作)。

預先授權

測試規範

如要測試這項變更,請停用鬧鐘與應用程式的提醒權限 從系統設定中的特殊應用程式存取權頁面 (設定 > 應用程式 >) 特殊應用程式存取權 >鬧鐘與提醒),然後觀察應用程式的行為。