Android には、デバイスが電源に接続されていないときのアプリの動作を管理することでバッテリーを長持ちさせる、Doze とアプリ スタンバイの 2 つの省電力機能があります。「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 モードとアプリ スタンバイ モードでテストするをご覧ください。
アプリ スタンバイについて
アプリ スタンバイを使用すると、ユーザーがアプリをアクティブに使用していないときに、システムはアプリがアイドル状態であると判断できます。この判断は、ユーザーが一定時間アプリに触れず、かつ、以下のいずれの条件にも当てはまらない場合に行われます。
- ユーザーがアプリを明示的に起動している。
- アプリのプロセスが、アクティビティまたはフォアグラウンド サービスとして現在フォアグラウンドにあるか、別のアクティビティもしくはフォアグラウンド サービスで使用されている。
- アプリが生成する通知は、ロック画面または通知トレイに表示されます。
ユーザーがデバイスを電源に接続すると、アプリはスタンバイ状態から解放され、ネットワークに自由にアクセスして、保留中のジョブと同期を実行できます。デバイスが長時間アイドル状態の場合、システムはアイドル状態のアプリに対して 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 使用の可否 | 免除は許可されますか? | Notes |
---|---|---|---|---|
インスタント メッセージ、チャット、通話アプリ | デバイスが Doze モードまたはアプリ スタンバイ状態のときに、ユーザーにリアルタイム メッセージを配信する必要があります。 | FCM を使用できます。 | 登録不可 | 優先度の高い FCM メッセージを使用して、アプリを復帰させ、ネットワークにアクセスします。 |
はい。ただし、FCM の優先度の高いメッセージを使用していません。 | ||||
インスタント メッセージ、チャット、通話アプリ、エンタープライズ VOIP アプリ。 | いいえ。別のメッセージ サービスへの技術的な依存関係があるか、Doze とアプリ スタンバイによってアプリのコア機能が妨げられるため、FCM を使用できません。 | 許容できる | ||
緊急情報サービスアプリ。 | ユーザーと家族の安全を守るアプリ。 | 該当する場合のみ記入 | 許容できる | |
タスク自動化アプリ。 | アプリのコア機能は、インスタント メッセージ、音声通話、新しい写真の管理などの自動アクションのスケジュール設定です。 | 該当する場合のみ記入 | 許容できる | |
周辺機器デバイスのコンパニオン アプリ。 | アプリのコア機能は、周辺機器のインターネット アクセスを可能にするために、周辺機器との永続的な接続を維持します。 | 該当する場合のみ記入 | 許容できる | |
アプリは、同期するために定期的に周辺機器に接続するか、標準の Bluetooth プロファイルで接続されたデバイス(ワイヤレス ヘッドフォンなど)にのみ接続するだけで済みます。 | 該当する場合のみ記入 | 登録不可 |