Skip to content

Most visited

Recently visited

navigation

Doze と App Standby 用に最適化する

Android 6.0(API レベル 23)以降には、端末が電源に接続していない場合のアプリの動作を管理することで、ユーザー向けにバッテリーの寿命を延ばす 2 種類の省電力機能が導入されています。 「Doze」は、端末が長い間使用されていない場合にアプリのバックグラウンド CPU とネットワーク アクティビティを保留することで電力消費を抑えます。 「アプリ スタンバイ」は、ユーザーがしばらくの間操作していないアプリのバックグラウンド ネットワーク アクティビティを保留します。

Doze とアプリ スタンバイは、API レベル 23 を明示的にターゲットとしているかどうかに関係なく、Android 6.0 以降で実行されるすべてのアプリの動作を管理します。 最適なユーザー エクスペリエンスを実現するため、アプリを Doze モードとアプリ スタンバイ モードでテストし、コードを必要に応じて調整します。 詳細については以下のセクションをご覧ください。

Doze を理解する

ユーザーが端末を電源と接続せずに静止状態にし、画面をオフにすると、端末は Doze モードになります。 Doze モードでは、ネットワークや CPU に高負荷をかけるサービスへのアプリのアクセスをシステムで制限することにより、バッテリーの節約を図ります。 さらにネットワークへのアプリのアクセスが切断され、ジョブ、同期、標準アラームが保留になります。

システムは定期的に Doze モードから短期間抜け出し、アプリが保留アクティビティを完了できるようにします。 この「メンテナンスの時間枠」中に、システムはすべての保留中の同期、ジョブ、アラームを実行し、アプリがネットワークにアクセスできるようにします。

図 1 Doze モードではメンテナンスの時間枠を繰り返し設けることで、アプリがネットワークを使用して保留中のアクティビティを処理できるようにします。

メンテナンスの時間枠が終了するたびに、システムは再び Doze モードに入り、ネットワークへのアクセスを切断し、ジョブ、同期、アラームを保留にします。 端末が充電中ではなく長期間使用されていない場合、システムはメンテナンスの時間枠の発生頻度を徐々に減らしていき、バッテリーの消費量を抑えます。

放置していた端末を動かす、画面をオンにする、充電器に接続するなどの動作によって端末をアクティブすると、Doze モードは解除され、すべてのアプリが通常のアクティビティに戻ります。

Doze の制限事項

Doze 中は、アプリに次の制限が適用されます。

Doze チェックリスト

アプリを Doze に適応させる

Doze は、アプリの機能や使用するサービスに応じて、アプリに異なる影響を及ぼす可能性があります。 多くのアプリは、修正しなくても Doze サイクル全体で正常に機能します。 ただし、場合によっては、ネットワーク、アラーム、ジョブ、同期をアプリが管理する方法を最適化する必要があります。 アプリは、メンテナンスの時間枠ごとに、アクティビティを効率的に管理する必要があります。

Android 5.1(API レベル 22)以前では、Doze モード中はアラームが発生しないため、Doze は AlarmManager アラームとタイマーが管理するアクティビティに特に影響を及ぼす可能性があります。

アラームのスケジュール設定をサポートするため、Android 6.0(API レベル 23)では、setAndAllowWhileIdle()setExactAndAllowWhileIdle() という 2 つの新しい AlarmManager メソッドが導入されています。 このメソッドを使用すると、端末が Doze モードになっていてもアラームが発生するように設定できます。

注: setAndAllowWhileIdle()setExactAndAllowWhileIdle() のどちらのメソッドも、各アプリに対して 9 分に 1 回以上アラームを発生させることができません。

Doze のネットワーク アクセス制限は、通知などのリアルタイム メッセージに依存しているアプリに特に影響を及ぼす可能性があります。 メッセージ受信にネットワークへの継続的な接続を必要とするアプリでは、できるだけ Google Cloud Messaging(GCM)を使用してください。

Doze モード中にアプリが期待通りに動作するかを確認するには、adb コマンドでシステムを強制的に Doze モードにしてからモードを解除して、アプリの動作を監視します。 詳細については、Doze モードとアプリ スタンバイ モードでテストするを参照してください。

アプリ スタンバイを理解する

アプリ スタンバイを使用すると、ユーザーがアプリをアクティブに使用していない場合、システムはアプリがアイドル状態であると判断します。 システムは、ユーザーが一定時間アプリをタップしておらず、次のどの条件にも該当しないときにこの判断を行います。

端末を電源に接続すると、アプリはスタンバイ状態から抜け、ネットワークに自由にアクセスできるようになり、保留中のジョブと同期をすべて実行できます。 端末が長時間アイドル状態の場合、システムによってアイドル中のアプリは 1 日 1 回程度ネットワーク アクセスを許可されます。

端末がアイドル状態の間、GCM でアプリにデータを送信する

Google Cloud Messaging(GCM)はクラウドから端末へのサービスで、Android 端末でのバックエンド サービスとアプリ間のリアルタイム ダウンストリーム メッセージングをサポートします。 GCM は、単一の継続的な接続をクラウドに提供します。リアルタイム メッセージングを必要とするすべてのアプリはこの接続を共有できます。 この共有接続により、バッテリーを著しく消費する可能性がある継続的な接続を、複数のアプリが個別に保持する必要がなくなるため、バッテリーの消費が大幅に最適化されます。 このため、バックエンド サービスとのメッセージ統合が必要なアプリでは、継続的なネットワーク接続を個別で保持するよりも、できるだけ GCM を使用することを強くお勧めします。

GCM は、優先度の高い GCM メッセージを使用することで、Doze とアプリ スタンバイのアイドルモードに対応するように最適化されています。 GCM の優先度の高いメッセージは、ユーザーの端末が Doze モードになっている、またはアプリがスタンバイ モードになっている場合でも、アプリを確実にアクティブにして、ネットワークにアクセスできるようにします。 Doze モードまたはアプリ スタンバイ モード中に、システムからメッセージが配信されると、アプリはネットワーク サービスに一時的にアクセス可能になり部分的な WakeLock を取得します。その後、端末またはアプリがアイドル状態に戻ります。

上記の動作以外では、優先度の高い GCM メッセージは Doze モードには影響せず、他のどのアプリの状態にも影響を及ぼしません。 これは、アプリが GCM を使用すれば、システムと端末全体へのバッテリーの影響を最小限に抑えながら効率的に通信できることを示しています。

ダウンストリーム メッセージングを必要とするアプリでは、通常 GCM の使用が推奨されます。 サーバーとクライアントが既に GCM を利用している場合は、重要なメッセージに対して、サービスで優先度の高いメッセージを利用するようにしてください。これにより、端末が Doze モードになっていても確実にアプリをアクティブにすることができます。

他のユースケースのサポート

ネットワーク接続、アラーム、ジョブ、同期を適切に管理し、GCM の優先度の高いメッセージを使用することで、大半のアプリで Doze をサポートすることができます。 ただし、これだけでは不十分なユースケースも一部存在します。 このような例に対応するため、Doze 最適化とアプリ スタンバイ最適化の対象から一部除外されるアプリを設定できるホワイトリストがシステムで提供されています。

このホワイトリストに含まれるアプリは、Doze モード中やアプリ スタンバイ中でもネットワークの使用が可能で、部分的な wake locks を保持することができます。 ただし、ホワイトリストに含まれるアプリにも、他のアプリと同様に他の制限は適用されます。 たとえば、ホワイトリストに含まれるアプリのジョブと同期は(API レベル 23 以下で)保留され、アプリの定期 AlarmManager アラームは発生しません。 アプリが対象外ホワイトリストに現在含まれているかどうかを確認するには、isIgnoringBatteryOptimizations() を呼び出します。

ユーザーは、[Settings] > [Battery] > [Battery Optimization] でホワイトリストを手動で設定できます。 また、システムでもアプリをホワイトリストに登録する方法が提供されています。

アプリをホワイトリストに追加するかどうかユーザーに確認する前に、そのアプリがホワイトリスト登録が可能なユースケースに適合しているか確認する必要があります。

注: Google Play ポリシーでは、アプリの主要機能が悪影響を受けない限り、アプリを直接的に Android 6.0 以降の電力管理機能(Doze とアプリ スタンバイ)の対象外とするよう要求することを禁止しています。

Doze モードとアプリ スタンバイ モードでテストする

優れたユーザー エクスペリエンスを実現するため、Doze モードとアプリ スタンバイ モードでアプリを十分にテストする必要があります。

アプリで Doze をテストする

次の手順を実行して Doze モードをテストします。

  1. Android 6.0(API レベル 23)以降のシステム イメージ搭載のハードウェア端末または仮想端末を設定します。
  2. 端末を開発マシンに接続し、アプリをインストールします。
  3. アプリを実行し、アクティブ状態のままにします。
  4. 端末画面をオフにします。(アプリはアクティブなままです。)
  5. 次のコマンドを実行して強制的に Doze モードに移行します。
    $ adb shell dumpsys battery unplug
    $ adb shell dumpsys deviceidle step

    2 つ目のコマンドについては、複数回実行する必要がある場合があります。端末がアイドル状態になるまで繰り返します。

  6. 端末を再びアクティブ状態にした後のアプリの動作を監視します。端末が Doze モードから抜けるときに、アプリがスムーズに復帰することを確認してください。

アプリでアプリ スタンバイをテストする

アプリでアプリ スタンバイ モードをテストするには:

  1. Android 6.0(API レベル 23)以降のシステム イメージ搭載のハードウェア端末または仮想端末を設定します。
  2. 端末を開発マシンに接続し、アプリをインストールします。
  3. アプリを実行し、アクティブ状態のままにします。
  4. 次のコマンドを実行してアプリを強制的にスタンバイ モードにします。
    $ adb shell dumpsys battery unplug
    $ adb shell am set-inactive <packageName> true
  5. 次のコマンドを実行して、アプリの復帰をシミュレートします。
    $ adb shell am set-inactive <packageName> false
    $ adb shell am get-inactive <packageName>
  6. 復帰後のアプリの動作を監視します。アプリがスタンバイ モードからスムーズに復帰することを確認してください。 特に、アプリの通知とバックグラウンド ジョブが想定通りの動作を続けているかを確認する必要があります。

ホワイトリスト登録が可能なユースケース

以下の表に、バッテリー最適化の対象外ホワイトリストへの登録、または登録要求が可能なユースケースをまとめています。 Doze やアプリ スタンバイがアプリの主要機能に悪影響を及ぼす場合、またはアプリが技術的な理由から GCM の優先度の高いメッセージを使用できない場合を除き、通常はアプリをホワイトリストに載せるべきではできません。

詳しくは、他のユースケースのサポートをご覧ください。

タイプ ユースケース GCM 使用の可否 ホワイトリスト登録の可否
インスタント メッセージ、チャット、通話アプリ端末が Doze モードになっている、またはアプリがスタンバイ状態の間、リアルタイム メッセージをユーザーに配信する必要がある。 可能。GCM を使用中。登録不可アプリを復帰させ、ネットワークにアクセスするために GCM の優先度の高いメッセージを使用する必要がある。
可能だが、現在 GCM の優先度の高いメッセージを使用していない。
インスタント メッセージ、チャット、通話アプリ、エンタープライズ VoIP アプリ 不可。別のメッセージ サービスへの技術的な依存関係、または Doze とアプリ スタンバイによりアプリの主要機能に悪影響が生じるため、GCM を使用できない。 登録可
タスク自動化アプリアプリの主要機能が、インスタント メッセージ、音声通話、新しい写真の管理、ロケーション操作などの自動化操作をスケジュールしている。 妥当な場合は可能 登録可
周辺機器コンパニオン アプリアプリの主要機能が、周辺機器のインターネット アクセスを可能にするために、周辺機器との継続的な接続を維持する。 妥当な場合は可能 登録可
アプリでは、定期的な同期のための周辺機器接続、標準 Bluetooth プロフィールを経由のワイヤレス ヘッドホンなどの機器への接続のみが必要。 妥当な場合は可能 登録不可
This site uses cookies to store your preferences for site-specific language and display options.

Hooray!

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a one-minute survey?
Help us improve Android tools and documentation.