DeviceIdleController とは
SystemService で常に実行されている。M Preview の Doze モードを実装するためのもの。
挙動
以下のイベントを監視する。
- Screen on/off
- Charging status
- Significant motion detect
上記の状態に応じて、以下のステートを遷移する。
- ACTIVE
- Device is currently active.
- INACTIVE
- Device is inactve (screen off, no motion) and we are waiting to for idle.
- IDLE_PENDING
- Device is past the initial inactive period, and waiting for the next idle period.
- IDLE
- Device is in the idle state, trying to stay asleep as much as possible.
- IDLE_MAINTENANCE
- Device is in the idle state, but temporarily out of idle to do regular maintenance.
流れ
-
onBootPhase(int)
- 初期化
- ディスプレイの状態をチェック
-
ディスプレイの状態をチェック
ディスプレイが OFF → becomeInactiveIfAppropriateLocked
ディスプレイが ON → becomeActiveLocked("screen")
-
アラームを AlarmManager#set() もしくは AlarmManager#setIdleUntil() メソッドでセットする
-
アラームで起きるたびに以下の遷移を行う
STATE_INACTIVE → STATE_IDLE_PENDING → STATE_IDLE → STATE_IDLE_MAINTAINANCE → STATE_IDLE → STATE_IDLE_MAINTAINANCE
ホワイトリスト
システムアプリとユーザーアプリをホワイトリストに登録している。
システムアプリ
System#getAllowInPowerSave() で取れるっぽい。
ユーザーアプリ
system/deviceidle.xml
にまとめられているっぽい。
メモ書き
- becomeInactiveIfAppropriateLocked スクリーンが OFF で充電中でなければ INACTIVE に移行して、アラームをセット
- becomeActiveLocked アラームをキャンセルして、motion detection のリスナーを外す
- stepIdleStateLocked
- AlarmManager#setIdleUntil 次のアラームの時間まで AlarmManager を idle にする(?)
参考
Cross Reference: /com/android/server/DeviceIdleController.java Diving Into Android 'M' Doze - NewCircle