在行動裝置上,電源管理與背景任務的安排是系統效能與使用者體驗的關鍵。Android 系統中有一個重要的服務 —— AlarmManagerService,它負責管理定時任務 (Scheduled Tasks),讓應用程式能在特定時間被喚醒執行。
然而,隨著 Android 版本的演進,Google 為了省電引入了 Doze 模式、App Standby,並逐步鼓勵開發者使用 JobScheduler、WorkManager 取代過度依賴 AlarmManager 的行為。
AlarmManagerService 位於 Android Framework 層級,由 SystemServer 啟動。它的主要職責包含:
[App 層]
| AlarmManager API (setExact, setRepeating, etc.)
v
[Framework 層]
AlarmManagerService
|-- AlarmStore (保存鬧鐘)
|-- AlarmThread (專責處理事件)
v
[Kernel 層]
Alarm 驅動 (RTC, ELAPSED_REALTIME, etc.)
v
[回調 App]
BroadcastReceiver / PendingIntent
val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
val intent = Intent(context, MyReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0)
alarmManager.setExact(
AlarmManager.RTC_WAKEUP,
System.currentTimeMillis() + 60_000,
pendingIntent
)
==>在 1 分鐘後觸發。
alarmManager.setRepeating(
AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + 10_000,
60_000,
pendingIntent
)
==> 每分鐘觸發一次,但 Android 5.1 以後可能被合併 (batching)。
alarmManager.setExactAndAllowWhileIdle(
AlarmManager.RTC_WAKEUP,
System.currentTimeMillis() + 60_000,
pendingIntent
)
==> 用於需要高優先級的任務,但 Google 不建議頻繁使用。
隨著 Android 發展,Google 更傾向使用 JobScheduler 與 WorkManager,原因是它們能夠:
比較表
機制 適用情境 特點
AlarmManager 精準定時、週期性事件 適合「提醒類事件」,不適合頻繁背景任務
JobScheduler 系統級任務排程 支援條件限制 (網路/充電)
WorkManager 跨版本任務排程 封裝 AlarmManager + JobScheduler,推薦使用
Android 為了降低耗電,引入了一系列機制:
[App 設定 Alarm]
|
v
[AlarmManagerService] --- 儲存於 AlarmStore
|
v
[AlarmThread 驅動]
|
v
[PendingIntent] ---> [BroadcastReceiver / Service]
+-----------------+
| AlarmManager | --> 精準定時 (提醒/鬧鐘)
+-----------------+
|
v
+-----------------+
| JobScheduler | --> 系統條件 (網路/充電)
+-----------------+
|
v
+-----------------+
| WorkManager | --> 跨版本、推薦使用
+-----------------+
AlarmManagerService 是 Android 定時與排程的基礎服務,負責應用程式的鬧鐘與定時任務。
但隨著 Doze 與省電政策 的引入,AlarmManager 的能力受到限制。
Google 建議開發者改用 JobScheduler 或 WorkManager,避免濫用 AlarmManager。
對於開發者而言,AlarmManager 適合「通知、提醒」等精準事件,而長期背景工作應改用新排程框架。