Android は、デバイスのバッテリー寿命を延ばすため、デバイスの使用状況や起動状態を監視してデバイスのステータスを管理します。デバイスが使用されていない間、プラットフォームはアクティビティの実行を一時停止して、スリープ状態に入ることができます。
Doze について
Doze モードは、デバイスが長時間にわたって使用されない場合、アプリのバックグラウンド CPU とネットワーク アクティビティを保留にして電池寿命を延長します。
Doze モードでアイドル状態のデバイスは定期的にメンテナンスの時間枠に入り、その間にアプリは保留中の作業(同期、ジョブなど)を完了します。その後、デバイスはより長い時間スリープ状態に入り、次のメンテナンス時間枠に入ります。プラットフォームは、数時間におよぶ最大スリープ時間に達するまで毎回アイドル時間を延長しながら、Doze モードのスリープ / メンテナンス シーケンスを繰り返します。Doze モードのデバイスは常にモーションを認識し、モーションが検出されるとすぐに Doze モードを終了します。
Android 7.0 以降では Doze モードが拡張され、ユーザーが動き回っていてもデバイス画面をオフにするたびに簡易最適化が実行されるため、電池寿命が長くなります。
重要なシステム サービスは通常、デバイスのメーカーによって Doze モードから除外されるように設定されています。ユーザーは、[設定] メニューで特定のアプリを Doze モードから除外することもできます。ただし、アプリの除外によってデバイスの電池の消耗が早まることがあります。 デフォルトでは、Doze は AOSP で無効になっています。Doze の有効化について詳しくは、Doze の統合をご覧ください。
Dose の要件
Doze をサポートするには、デバイスに Firebase Cloud Messaging(FCM)などのクラウド メッセージング サービスが必要です。クラウド メッセージングのような外部トリガー イベントは、デバイスが Doze モードでもアプリを一時的に起動して動作させます。
Doze を完全にサポートするには、デバイスに重要なモーション検出器(SMD)も必要です。ただし、Android 7.0 以降の簡易 Doze モードには、SMD は必要ありません。Doze が有効になっている場合、デバイスは以下のように動作します。
- SMD があるデバイスでは、完全な Doze 最適化が実行される(簡易最適化を含む)。
- SMD がないデバイスでは、簡易 Doze 最適化のみが実行される。
Doze のライフサイクル
Doze モードは、デバイスがアイドル状態であることをプラットフォームが検出すると開始され、終了基準のアクティビティが発生すると終了します。
プラットフォームは、次の場合にデバイスがアイドル状態であることを検出します。
- デバイスが静止している(SMD を使用)。
- デバイス画面がしばらくの間オフになっている。
電池式のデバイスが充電器に接続されている場合、Doze モードは作動しません。
Doze 期間
プラットフォームはシステムをスリープ状態に維持しますが、その間、メンテナンス時間枠に通常のオペレーションを再開してその後再びスリープ状態に戻すことを繰り返します。スリープ状態の期間はそのたびに長くなります。スリープ中は、次のような制限が有効になります。
- アプリはネットワークにアクセスできない。
- アプリのウェイクロックが無視される。
- アラームが延期される。目覚まし時計のアラームと
setAndAllowWhileIdle()
を使用して設定したアラーム(Doze モード中は、各アプリで 15 分おきに 1 つに制限されます)は除外されます。イベント リマインダーに通知を表示するアプリ(カレンダーなど)を対象に、このような除外が適用されます。 - Wi-Fi スキャンが行われない。
SyncAdapter
の同期とJobScheduler
のジョブが、次のメンテナンス時間枠まで延期される。- 処理を完了するため、SMS および MMS メッセージを受信するアプリが一時的にホワイトリストに登録される。
終了
プラットフォームは、次のようなアクティビティを検出すると Doze モードを終了します。
- ユーザーによるデバイスの操作
- デバイスの動き
- デバイスの画面がオンになる
- 目覚まし時計のアラームの時刻が近い
通知によってデバイスの Doze モードが終了することはありません。
Android 7.0 以降では Doze が拡張され、画面がオフの間に簡易スリープモードに入り、その後デバイスがアイドル状態になります。
図 1. 静止していない状態および静止状態のデバイスの Doze モード。
アクション | Doze | 簡易 Doze |
---|---|---|
トリガー | 画面オフ、電池使用、静止 | 画面オフ、電池使用(充電器に接続していない状態) |
タイミング | メンテナンスごとに継続的に時間を延長 | メンテナンス時間枠ごとに N 分間の繰り返し |
制限 | ネットワーク アクセス、ウェイクロック、GPS / Wi-Fi スキャンなし。アラームおよびジョブ / 同期を延期。 | ネットワークへのアクセス権なし。メンテナンス時間枠以外はジョブ / 同期を延期。 |
動作 | 優先度の高いプッシュ通知メッセージのみを受信。 | すべてのリアルタイム メッセージ(インスタント メッセージ、通話など)を受信。優先度の高いプッシュ通知メッセージを受信すると、一時的にネットワークへのアクセスが可能になります。 |
終了 | モーション、画面オン、目覚まし時計のアラーム | 画面オン |
アプリ スタンバイへの対応
- Doze モードの時間は、アプリ スタンバイにはカウントされません。
- デバイスが Doze モードの間、アイドル状態のアプリは 1 日に 1 回以上通常のオペレーションを実行できます。
Doze の統合
Doze が有効な場合、SENSOR_TYPE_SIGNIFICANT_MOTION
をサポートするデバイスは完全な Doze 最適化(簡易最適化を含む)を実行し、SMD をサポートしないデバイスは簡易 Doze 最適化のみを実行します。Android は適切な Doze 最適化を自動的に選択するため、ベンダーによる設定は不要です。
デバイスで Doze を有効にするには、次の操作を行います。
- デバイスにクラウド メッセージ サービスがインストールされていることを確認します。
- デバイス オーバーレイ構成ファイル
overlay/frameworks/base/core/res/res/values/config.xml
で、config_enableAutoPowerModes
をtrue
に設定します。 AOSP では、このパラメータはデフォルトで<bool name="config_enableAutoPowerModes">true</bool>
false
(Doze が無効)に設定されています。 - プリロードされたアプリとサービスが次の内容にあてはまることを確認します。
- 省電力の最適化に関するガイドラインを遵守している。詳しくは、アプリのテストと最適化をご覧ください。
または
- Doze とアプリ スタンバイから除外されている。詳しくは、アプリを除外するをご覧ください。
- 省電力の最適化に関するガイドラインを遵守している。詳しくは、アプリのテストと最適化をご覧ください。
- 必要なサービスが Doze から除外されていることを確認します。
ヒント
- 可能な場合、ダウンストリーム メッセージングには FCM を使用します。
- ユーザーがすぐに通知を表示する必要がある場合は、FCM の優先度の高いメッセージを使用してください。
- 最初のメッセージ ペイロード内に十分な情報を含めます(その後の不要なネットワーク アクセスを避けるため)。
setAndAllowWhileIdle()
とsetExactAndAllowWhileIdle()
で重要なアラームを設定します。
アプリのテストと最適化
すべてのアプリ(特にプリロードされたアプリ)を Doze モードでテストします。詳しくは、Doze モードとアプリ スタンバイ モードでテストするをご覧ください。