ユーザーが Android デバイスをアイドル状態のままにすると、バッテリーの消耗を防ぐためにデバイスはすぐにサスペンド状態になります。ただし、アプリで CPU がスリープ状態にならないようにする必要がある場合もあります。場合によっては、アプリが動作している間、画面をオンにしておくことが必要になることがあります。他のケースでは、アプリは画面をオンのままにする必要はありませんが、CPU をアクティブにする必要があります。
アプリのニーズは、デベロッパーが採用するアプローチによって決まります。ただし、一般的な経験則として、できる限り軽量なアプローチを採用し、アプリがシステム リソースに及ぼす影響を最小限に抑える必要があります。このドキュメントでは、状況に応じて適切な Android テクノロジーを選択できるようにします。
適切なテクノロジーを選択する
デバイスをスリープ状態にしない最適な方法は、アプリのニーズによって異なります。このセクションでは、適切なアプローチを選択できるようにします。
- アプリは画面をオンにする必要がありますか?
- 「はい」の場合は、画面をオンにするをご覧ください。必要な機能を実行する専用の API がある場合があります。たとえば、通話 UI を実装する場合は、Android テレコム フレームワークを使用できます。このフレームワークは、必要に応じて画面をオンに保ちます。状況に応じた専用 API がない場合は、
keepScreenOn
API を使用できます。
- 「はい」の場合は、画面をオンにするをご覧ください。必要な機能を実行する専用の API がある場合があります。たとえば、通話 UI を実装する場合は、Android テレコム フレームワークを使用できます。このフレームワークは、必要に応じて画面をオンに保ちます。状況に応じた専用 API がない場合は、
- アプリがフォアグラウンド サービスを実行していて、サービスが実行されている間、画面がオフでもデバイスをスリープ状態にしない必要があるか。
- [いいえ] の場合は、デバイスをスリープ状態にする必要はありません。ユーザーがアプリをアクティブに操作している場合、デバイスはスリープ状態になりません。ユーザーがアプリを操作しておらず、フォアグラウンド サービスを実行していない場合は、必要に応じてデバイスをスリープモードにする必要があります。ユーザーがアプリを使用していない間に一部の処理を実行するだけの場合は、バックグラウンド タスクのドキュメントで最適なオプションを確認してください。
- 「はい」の場合は、まず、フォアグラウンド サービスを実際に使用する必要があることを確認します。状況によっては、フォアグラウンド サービスではなく、ニーズを満たすために使用できる特殊な API がある場合があります。これらの機能については、フォアグラウンド サービスのドキュメントをご覧ください。たとえば、ユーザーの位置情報を追跡する必要がある場合は、
location
フォアグラウンド サービスの代わりに Geofencing API を使用できます。
- フォアグラウンド サービスが実行されていて、デバイスの画面がオフのときにデバイスが停止した場合、ユーザー エクスペリエンスに悪影響はありますか?(たとえば、フォアグラウンド サービスを使用して通知を更新している場合、デバイスが停止してもユーザー エクスペリエンスに悪影響はありません)。
- いいえの場合は、ウェイクロックを使用しないでください。ユーザーがデバイスを操作すると、アクションが自動的に再開され、デバイスはサスペンド状態から解除されます。
- はいの場合は、wake lock を使用する必要がある場合があります。ただし、デバイスをスリープ状態にしないアクションで説明されているように、すでに API を使用しているか、代わりにウェイクロックを宣言するアクションを実行しているかどうかを確認する必要があります。
デバイスの起動状態を維持するアクション
アプリが次のいずれかを行っている場合、wake lock を手動で設定する必要はありません。次のアクションと API はすべて、デバイスを常にスリープ解除状態に保ちます。
- 音声を再生している場合、オーディオ システムがウェイクロックを設定して管理するため、自分で設定する必要はありません。
- タスク スケジューリング API またはライブラリ(WorkManager、
JobScheduler
、DownloadManager
など)を使用している場合、システムまたはライブラリがユーザーに代わってウェイクロックを取得します。 - Media3 ExoPlayer を使用している場合は、
ExoPlayer.setWakeMode()
を使用して、プレーヤーにウェイクロックを設定させることができます。 - 一部のデバイスのセンサーはウェイクアップ センサーです。
SensorManager
を使用すると、これらのセンサーが報告するデータがあるときにデバイスをウェイクアップできます。センサーがウェイクアップ センサーかどうかを確認するには、Sensor.isWakeUpSensor
を呼び出します。