安卓手機APP開發___設置鬧鐘
目錄
概述
設置不精確鬧鐘
在特定時間后發出鬧鐘
在特定時間范圍內觸發鬧鐘
以大致有規律的時間間隔響起重復鬧鐘
設置精確的鬧鐘
系統會在未來的某個精確時刻調用精確鬧鐘。
可能不需要精確鬧鐘的用例
設置精確鬧鐘的方法
系統資源消耗
聲明適當的精確鬧鐘權限
使用 SCHEDULE_EXACT_ALARM 權限
概述
鬧鐘(基于 AlarmManager 類)為您提供了一種在應用生命周期之外
執行基于時間的操作的方法。例如,您可以使用鬧鐘啟動長時間運行
的操作,如每天啟動一次服務以下載天氣預報。
鬧鐘具有以下特征:
??? 它們可讓您按設定的時間和/或間隔觸發 intent。
??? 您可以將它們與廣播接收器結合使用,以安排作業或 WorkRequest 以執行其他操作。
??? 它們在應用之外運行,因此即使您的應用未運行,甚至設備本身處于休眠狀態,
??? 您也可以使用它們觸發事件或操作。
??? 它們可以幫助您最大限度地減少應用的資源需求。您可以安排操作,而無需
??? 依賴計時器或持續運行服務。
注意 :對于保證在應用生命周期內發生的計時操作,請考慮將 Handler 類與
Timer 和 Thread 結合使用。此方法可讓 Android 更好地控制系統資源。
設置不精確鬧鐘
如果應用設置了不精確鬧鐘,系統會在未來的某個時間點發出鬧鐘。不精確鬧鐘可
在遵循低電耗模式等省電限制的同時,保證鬧鐘的發送時間。
注意 :大多數應用都可以使用不精確的鬧鐘來調度任務和事件。如果應用的核心
功能依賴于精確計時的鬧鐘(例如鬧鐘應用或日歷應用),則可以改用精確鬧鐘。
開發者可以利用以下 API 保證來自定義不精確鬧鐘的發送時間。
在特定時間后發出鬧鐘
如果您的應用調用 set()、setInexactRepeating() 或 setAndAllowWhileIdle(),
則鬧鐘絕不會在提供的觸發時間之前響起。
在 Android 12(API 級別 31)及更高版本中,除非已實施任何節電限制
(例如省電模式或低電耗模式),否則系統會在提供的觸發時間后的 1
小時內調用鬧鐘。
在特定時間范圍內觸發鬧鐘
如果您的應用調用 setWindow(),則鬧鐘絕不會在所提供的觸發時間之前響起。
除非任何省電限制生效,否則鬧鐘會在指定的時間范圍內(從指定的觸發時間開始)
內發出。
如果您的應用以 Android 12 或更高版本為目標平臺,則系統可以將對帶時間范
圍的不精確鬧鐘的調用延遲至少 10 分鐘。因此,600000 下的 windowLengthMillis
參數值會被裁剪為 600000。
以大致有規律的時間間隔響起重復鬧鐘
如果您的應用調用 setInexactRepeating(),系統會調用多個鬧鐘:
??? 第一個鬧鐘會在指定的時間范圍內觸發,從指定的觸發時間開始。
??? 后續鬧鐘通常會在指定時間范圍過后響起。兩次連續的鬧鈴調用的間隔
??? 時間可能會有所不同。
設置精確的鬧鐘
系統會在未來的某個精確時刻調用精確鬧鐘。
大多數應用都可以使用不精確鬧鐘來調度任務和事件,以完成幾個常見用例。
如果應用的核心功能依賴于精確計時的鬧鐘(例如鬧鐘應用或日歷應用),
則可以改用精確鬧鐘。
注意 :如果您的應用以 Android 12 或更高版本為目標平臺,您必須聲明
一項“鬧鐘和提醒”權限。否則,會發生 SecurityException。
可能不需要精確鬧鐘的用例
以下列表顯示了可能不需要精確鬧鐘的常見工作流:
在應用的生命周期內調度計時操作
??? Handler 類包含幾種處理計時操作的好方法,例如在應用處于活動
??? 狀態時,每 n 秒執行一次工作:postAtTime() 和 postDelayed()。
??? 請注意,這些 API 依賴于系統正常運行時間,而不是實時。
安排好的后臺工作,例如更新應用和上傳日志
??? WorkManager 提供了一種安排時間敏感型定期工作的方法。您可以
??? 提供重復間隔和 flexInterval(至少 15 分鐘),以定義工作的
??? 精細運行時間。
應在特定時間過后執行的用戶指定操作(即使系統處于空閑狀態)
??? 使用不精確鬧鐘。具體來說,就是調用 setAndAllowWhileIdle()。
應在特定時間過后執行的用戶指定操作
??? 使用不精確鬧鐘。具體來說,就是調用 set()。
可在指定時間范圍內執行的用戶指定操作
??? 使用不精確鬧鐘。具體來說,就是調用 setWindow()。請注意,如
??? 果應用以 Android 12 或更高版本為目標平臺,則允許的最短窗口
??? 時長為 10 分鐘。
設置精確鬧鐘的方法
您的應用可以使用以下方法之一設置精確鬧鐘。這些方法按順序排列,
因此更靠近列表底部的方法可處理對時間更重要的任務,但需要更多系統資源。
setExact()
??? 只要其他省電措施沒有生效,在未來一個近乎精確的時間就會觸發鬧鐘。
??? 除非應用的工作對用戶來說非常關鍵,否則使用此方法設置精確的鬧鐘。
setExactAndAllowWhileIdle()
??? 在未來近乎精確的時間調用鬧鐘,即使采用了省電措施也是如此。
setAlarmClock()
??? 在未來某個精確時間啟動鬧鐘。由于用戶非常容易看到這些鬧鐘,
??? 因此系統絕不會調整其觸發時間。系統會將這些鬧鐘識別為最關鍵
??? 的鬧鐘,并在必要時關閉低功耗模式以實現鬧鐘。
??? 注意: 當您的應用使用此方法安排精確鬧鐘時,鬧鐘調用可能會
??? 嚴重影響設備的資源,如電池續航時間。
系統資源消耗
當系統觸發您的應用設置的確切鬧鐘時,設備會消耗大量的資源(如電池
續航時間),尤其是在設備處于節能模式時。此外,系統無法輕松地對
這些請求進行批處理,以便更高效地使用資源。
強烈建議您盡可能創建不精確鬧鐘。如需執行時間更長的工作,請使用
鬧鐘 BroadcastReceiver 中的 WorkManager 或 JobScheduler 進行調度。
如需在設備處于低電耗模式時執行工作,請使用 setAndAllowWhileIdle()
創建不精確鬧鐘,然后從該鬧鐘啟動作業。
注意 :Android 將精確鬧鐘視為對時間敏感的重要中斷。因此,精確的
鬧鐘不受前臺服務啟動限制的影響。
聲明適當的精確鬧鐘權限
如果您的應用以 Android 12 或更高版本為目標平臺,您必須獲得
“鬧鐘和提醒”特殊應用訪問權限。為此,請在應用的清單文件中聲明
SCHEDULE_EXACT_ALARM 權限,如以下代碼段所示:
<manifest ...><uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/><application ...>...</application>
</manifest>
如果您的應用以 Android 13(API 級別 33)或更高版本為目標平臺,您可以
選擇聲明 SCHEDULE_EXACT_ALARM 或 USE_EXACT_ALARM 權限。
<manifest ...><uses-permission android:name="android.permission.USE_EXACT_ALARM"/><application ...>...</application>
</manifest>
雖然 SCHEDULE_EXACT_ALARM 權限和 USE_EXACT_ALARM 權限表示的功能相同,
但權限授予方式不同,支持不同的用例。僅當應用中面向用戶的功能需要
精確計時的操作時,您的應用才應使用精確鬧鐘,并聲明 SCHEDULE_EXACT_ALARM
或 USE_EXACT_ALARM 權限。
USE_EXACT_ALARM
??? 已自動授予
??? 用戶無法撤消此操作
??? 遵守即將實施的 Google Play 政策
??? 有限用例
SCHEDULE_EXACT_ALARM
??? 用戶授予的權限
??? 更廣泛的應用場景
??? 應用應確認權限未被撤消
對于以 Android 13(API 級別 33)及更高版本為目標平臺的應用的新安裝,
系統不會預先授予 SCHEDULE_EXACT_ALARM 權限。如果用戶通過備份和恢復
操作將應用數據轉移到搭載 Android 14 的設備,新設備上的
SCHEDULE_EXACT_ALARM 權限會被拒絕。不過,如果現有應用已擁有此權限,
則當設備升級到 Android 14 時,系統會預先授予此權限。
注意:如果使用 OnAlarmListener 對象(如 setExact API)設置精確鬧鐘,
則無需 SCHEDULE_EXACT_ALARM 權限。
使用 SCHEDULE_EXACT_ALARM 權限
與 USE_EXACT_ALARM 不同,SCHEDULE_EXACT_ALARM 權限必須由用戶授予。
用戶和系統都可以撤消 SCHEDULE_EXACT_ALARM 權限。
如需檢查是否已向您的應用授予相應權限,請先調用 canScheduleExactAlarms(),
然后再嘗試設置精確鬧鐘。撤消應用的 SCHEDULE_EXACT_ALARM 權限后,應用會
停止運行,并取消將來的所有精確鬧鐘。這也意味著,canScheduleExactAlarms()
返回的值在應用的整個生命周期內有效。
向您的應用授予 SCHEDULE_EXACT_ALARMS 權限后,系統會向其發送
ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED 廣播。
您的應用應實現廣播接收器,以便執行以下操作:
??? 確認您的應用仍具有特殊應用訪問權限。為此,請調用 canScheduleExactAlarms()。
??? 此檢查可防止您的應用出現以下情況:用戶授予應用該權限,然后幾乎立即撤消該權限。
??? 根據應用的當前狀態,重新調度應用需要的任何精確的鬧鐘。此邏輯應與您的
??? 應用接收 ACTION_BOOT_COMPLETED 廣播時所執行的操作類似。
要求用戶授予 SCHEDULE_EXACT_ALARM 權限
該選項稱為“允許設置鬧鐘和提醒”
圖 1. 系統設置中的“鬧鐘和提醒”特殊應用訪問權限頁面,用戶可以在該頁面中
允許您的應用設置精確的鬧鐘。
如有必要,您可以將用戶轉到系統設置中的鬧鐘和提醒屏幕,如圖 1 所示。
為此,請完成以下步驟:
??? 在應用的界面中,向用戶解釋為什么您的應用需要調度精確的鬧鐘。
??? 調用包含 ACTION_REQUEST_SCHEDULE_EXACT_ALARM intent 操作的 intent。