Android には、デバイスが電源に接続されていない場合のアプリの動作を管理することでバッテリーの寿命を延ばす 2 種類の省電力機能(Doze とアプリ スタンバイ)があります。Doze モードは、デバイスが長時間使用されていないときに、アプリのバックグラウンド CPU とネットワーク アクティビティを保留にしてバッテリーの消費を抑えます。「アプリ スタンバイ」は、ユーザーが最近操作していないアプリのバックグラウンド ネットワーク アクティビティを保留します。
デバイスが Doze モードの間、バッテリーを大量に消費する特定のリソースへのアプリのアクセスは、メンテナンスの時間枠まで延期されます。具体的な制限については、電源管理に関する制限をご覧ください。
Doze とアプリ スタンバイは、API レベル 23 を明示的にターゲットとしているかどうかに関係なく、Android 6.0 以降で実行されるすべてのアプリの動作を管理します。最適なユーザー エクスペリエンスを実現するため、アプリを Doze モードとアプリ スタンバイ モードでテストし、コードに必要な調整を加えます。以降のセクションで、詳しく説明します。
Doze を理解する
ユーザーがデバイスを電源から外して静止状態にし、画面がオフの状態で一定時間続くと、デバイスは Doze モードになります。Doze モードでは、ネットワークや CPU 使用率の高いサービスへのアプリのアクセスがシステムで制限され、バッテリーの節約が試みられます。また、アプリがネットワークにアクセスしなくなり、ジョブ、同期、標準アラームを延期します。
システムは定期的に Doze モードを一時停止して、アプリが保留アクティビティを完了できるようにします。このメンテナンスの時間枠中、システムは保留中のすべての同期、ジョブ、アラームを実行し、アプリがネットワークにアクセスできるようにします。
メンテナンスの時間枠が終了すると、システムは再び Doze モードに入り、ネットワーク アクセスを一時停止し、ジョブ、同期、アラームを保留します。システムがメンテナンスの時間枠を設定する頻度は時間が経つにつれて減るため、デバイスが充電されていない状態で長時間使用されない場合に、バッテリーの消費量を抑えることができます。
放置していたデバイスを動かしたり、画面をオンにしたり、充電器に接続したりするなどの動作によってデバイスをアクティブにすると、Doze モードは解除され、すべてのアプリが通常のアクティビティを再開します。
Doze の制限事項
Doze モード中は、アプリに次の制限が適用されます。
- ネットワーク アクセスを停止します。
- wake lock を無視します。
- 標準の
AlarmManager
アラーム(setExact()
、setWindow()
など)を次のメンテナンスの時間枠まで延期します。- Doze 中にアラームが発生するように設定する必要がある場合は、
setAndAllowWhileIdle()
またはsetExactAndAllowWhileIdle()
を使用します。 setAlarmClock()
で設定されたアラームは、引き続き通常どおり起動します。アラームが鳴る直前に、システムは Doze モードを解除します。
- Doze 中にアラームが発生するように設定する必要がある場合は、
- Wi-Fi スキャンは実行されません。
- アダプターの同期は実行されません。
JobScheduler
は実行されません。
Doze チェックリスト
- 可能であれば、ダウンストリーム メッセージングには Firebase Cloud Messaging(FCM)を使用してください。
- ユーザーがすぐに通知を表示する必要がある場合は、 FCM の優先度の高いメッセージを使用してください。優先度の高いメッセージは、通知を表示するメッセージにのみ使用してください。詳しくは、Android のメッセージの優先度に関する FCM のドキュメントをご覧ください。
- 最初のメッセージ ペイロードに十分な情報を含めれば、後続のネットワークへのアクセスは必要ありません。
setAndAllowWhileIdle()
とsetExactAndAllowWhileIdle()
で重要なアラームを設定します。- Doze モードでアプリをテストします。
Doze 向けにアプリを調整する
Doze がアプリに与える影響は、アプリの機能や使用するサービスによって異なります。多くのアプリは、修正しなくても Doze サイクル全体で正常に機能します。ただし、場合によってはネットワーク、アラーム、ジョブ、同期をアプリが管理する方法を最適化する必要があります。アプリは、各メンテナンスの時間枠内でアクティビティを効率的に管理できなければなりません。
アラームのスケジュール設定をサポートするため、setAndAllowWhileIdle()
と setExactAndAllowWhileIdle()
という 2 つの AlarmManager
メソッドを使用できます。これらの方法を使用すると、デバイスが Doze モードの場合でもアラームが発生するように設定できます。
ネットワーク アクセスに対する Doze 制限は、特にアプリが通知や通知などのリアルタイム メッセージに依存している場合に、アプリに影響する可能性があります。アプリでメッセージを受信するためにネットワークへの永続的な接続が必要な場合は、可能であれば Firebase Cloud Messaging(FCM)を使用してください。
Doze モード中にアプリが期待どおりに動作することを確認するには、adb
コマンドを使用してシステムに強制的に Doze モードを開始してから Doze モードを終了し、アプリの動作を監視します。詳しくは、Doze モードとアプリ スタンバイ モードでテストするをご覧ください。
アプリ スタンバイについて
アプリ スタンバイを使用すると、ユーザーがアプリをアクティブに使用していないときに、システムはアプリがアイドル状態であると判断できます。システムは、ユーザーが一定時間アプリをタップしておらず、次の条件のいずれも該当しない場合に、この判断を行います。
- ユーザーがアプリを明示的に起動している。
- アプリに、アクティビティまたはフォアグラウンド サービスとして、または別のアクティビティまたはフォアグラウンド サービスで使用されているプロセスが現在フォアグラウンドにある。
- アプリがロック画面や通知トレイに表示される通知を生成する。
デバイスを電源に接続すると、アプリはスタンバイ状態から抜けてネットワークに自由にアクセスできるようになり、保留中のジョブと同期をすべて実行できます。デバイスが長時間アイドル状態の場合、システムはアイドル状態のアプリのネットワーク アクセスを 1 日に 1 回程度許可します。
デバイスがアイドル状態の間に FCM でアプリにデータを送信する
Firebase Cloud Messaging(FCM)はクラウドからデバイスへのサービスであり、Android デバイスでのバックエンド サービスとアプリ間のリアルタイム ダウンストリーム メッセージングをサポートします。FCM はクラウドへの単一かつ継続的な接続を提供します。リアルタイム メッセージングを必要とするすべてのアプリはこの接続を共有できます。この共有接続により、電池を著しく消費する可能性がある継続的な接続を複数のアプリが個別に保持する必要がなくなるため、電池の消費が大幅に最適化されます。このため、アプリでバックエンド サービスとのメッセージングの統合が必要な場合は、独自の永続的なネットワーク接続を維持するのではなく、可能であれば FCM を使用することを強くおすすめします。
FCM は、Doze モードとアプリ スタンバイ アイドルモードで動作するように最適化されています。FCM の優先度の高いメッセージを使用すると、アプリを復帰させ、ユーザーを引きつけることができます。Doze モードまたはアプリ スタンバイ モードでは、システムからメッセージが配信され、アプリにネットワーク サービスと部分的なウェイクロックへの一時的なアクセス権が付与された後、デバイスまたはアプリがアイドル状態に戻ります。時間的制約のある通知の場合は、優先度の高いメッセージを使用して Doze モードでの配信を有効にすることを検討してください。優先度の高いメッセージは通知される場合があります。詳しくは、優先度の高いメッセージに関する FCM のガイダンスをご覧ください。
バックグラウンドでアプリ コンテンツを最新の状態に保つ、データ同期を開始するなど、通知につながらないメッセージには、標準の優先度の FCM メッセージを使用します。デバイスが Doze モードでない場合、通常の優先度のメッセージが直ちに配信されます。デバイスが Doze モードの場合、定期的な Doze メンテナンスの時間枠中、またはユーザーがデバイスをスリープ状態から復帰させるとすぐに配信されます。
一般的なおすすめの方法として、アプリにダウンストリーム メッセージングが必要な場合は、FCM を使用します。アプリがすでに FCM を使用している場合は、ユーザーに通知を表示するメッセージにのみ優先度の高いメッセージを使用するようにしてください。
その他のユースケースのサポート
ほとんどのアプリは、ネットワーク接続、アラーム、ジョブ、同期を管理し、FCM メッセージを使用して、Doze をサポートできます。ただし、ユースケースが限定されている場合は、不十分な場合があります。このような場合のために、Doze 最適化とアプリ スタンバイ最適化から部分的に除外されるアプリの構成可能なリストがシステムに表示されます。
部分的に除外されたアプリは、Doze モード中やアプリ スタンバイ中でもネットワークの使用が可能で、部分的な wake lock を保持できます。ただし、その他の制限は他のアプリと同様に、アプリにも適用されます。たとえば、API レベル 23 以下ではアプリのジョブと同期が延期され、通常の AlarmManager
アラームは呼び出されません。アプリは isIgnoringBatteryOptimizations()
を呼び出すことで、現在除外リストにあるかどうかを確認できます。
ユーザーは、[設定] > [バッテリー] > [バッテリーの最適化] で、除外されるアプリのリストを手動で設定できます。また、システムは、アプリがユーザーを除外するように求める方法も提供します。
- ほとんどのアプリは、
ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS
を含むインテントを呼び出すことができます。 - 許容されるユースケースを満たすアプリは、代わりに
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
インテント アクションを含むインテントを呼び出して、ユーザーがシステム設定に移動せずに、アプリを除外リストに直接追加できるようにします。
アプリは isIgnoringBatteryOptimizations()
を呼び出すことで、現在除外リストにあるかどうかを確認できます。
Doze モードとアプリ スタンバイ モードでテストする
優れたユーザー エクスペリエンスを実現するため、Doze モードとアプリ スタンバイ モードでアプリを十分にテストします。
Doze でアプリをテストする
Doze モードをテストするには、次の操作を行います。
- Android 6.0(API レベル 23)以降のシステム イメージを搭載したハードウェア デバイスまたは仮想デバイスを設定する。
- デバイスを開発用 PC に接続してアプリをインストールします。
- アプリを実行してアクティブ状態のままにします。
- 次のコマンドを実行して、システムを強制的にアイドル状態にします:
$ adb shell dumpsys deviceidle force-idle
- 準備ができたら、次のコマンドを実行してアイドルモードを終了します。
$ adb shell dumpsys deviceidle unforce
- 次のコマンドを実行して、デバイスを再度アクティブにします。
$ adb shell dumpsys battery reset
- デバイスを再びアクティブ状態にした後のアプリの動作を監視します。デバイスが Doze モードから抜けたときに、アプリが適切に復旧することを確認してください。
アプリ スタンバイでアプリをテストする
アプリでアプリ スタンバイ モードをテストするには:
- Android 6.0(API レベル 23)以降のシステム イメージ搭載のハードウェア デバイスまたは仮想デバイスを設定します。
- デバイスを開発用 PC に接続してアプリをインストールします。
- アプリを実行してアクティブ状態のままにします。
- 次のコマンドを実行して、アプリを強制的にアプリ スタンバイ モードにします。
$ adb shell dumpsys battery unplug $ adb shell am set-inactive <packageName> true
- 次のコマンドを使用して、アプリの復帰をシミュレートします。
$ adb shell am set-inactive <packageName> false $ adb shell am get-inactive <packageName>
- 復帰後のアプリの動作を監視します。アプリがスタンバイ モードからスムーズに復帰することを確認してください。特に、アプリの通知とバックグラウンド ジョブが想定どおりに機能しているかどうかを確認します。
免除が適用されるユースケース
次の表に、いくつかのユースケースと、アプリがこれらの状況で ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
インテント アクションを使用できるかどうかを示します。Doze やアプリ スタンバイがアプリの主要機能に悪影響を及ぼす場合、またはアプリが技術的な理由から FCM の優先度の高いメッセージを使用できない場合を除き、通常はアプリがこれらの例外を満たすことはありません。
詳細については、他のユースケースのサポートをご覧ください。
タイプ | ユースケース | FCM 使用の可否 | 免除は可能か? | 備考 |
---|---|---|---|---|
インスタント メッセージ、チャット、通話アプリ | デバイスが Doze モードまたはアプリ スタンバイ モードになっている間、ユーザーにリアルタイムのメッセージを配信する必要があります。 | FCM を使用できます。 | 登録不可 | FCM の優先度の高いメッセージを使用してアプリを復帰させ、ネットワークにアクセスします。 |
可能ですが、現在 FCM の優先度の高いメッセージを使用していません。 | ||||
インスタント メッセージ、チャット、通話アプリ、エンタープライズ VoIP アプリ。 | いいえ。別のメッセージ サービスに技術的な依存関係があるため、FCM は使用できません。または、Doze とアプリ スタンバイがアプリのコア機能に悪影響を及ぼすことが原因です。 | 登録可 | ||
緊急情報サービス アプリ。 | ユーザーと家族の安全を守るアプリ。 | 該当する場合のみ記入 | 登録可 | |
タスク自動化アプリ。 | アプリのコア機能が、インスタント メッセージ、音声通話、新しい写真管理などの自動アクションをスケジュールすることです。 | 該当する場合のみ記入 | 登録可 | |
周辺機器のコンパニオン アプリ。 | アプリのコア機能は、周辺機器にインターネット アクセスを提供する目的で、周辺機器との永続的な接続を維持します。 | 該当する場合のみ記入 | 登録可 | |
アプリは、周辺機器に定期的に接続して同期するだけでよいか、標準の Bluetooth プロファイルで接続されたワイヤレス ヘッドフォンなどのデバイスに接続するだけで済みます。 | 該当する場合のみ記入 | 登録不可 |