デバイスの起動状態を維持する

バッテリーの消耗を避けるため、アイドル状態のままになっている Android デバイスはすぐにスリープ状態になります。ただし、一部の処理を完了するために、アプリで画面や CPU を復帰させ、復帰させておく必要がある場合もあります。

採用するアプローチはアプリのニーズによって異なりますが、原則として、アプリがシステム リソースに与える影響を最小限に抑えるには、アプリにとって可能な限り最も軽量な方法を採用する必要があります。以下のセクションでは、デバイスのデフォルトのスリープ動作がアプリの要件に適合しない場合に対処する方法について説明します。

wake lock の使用に代わる方法

ウェイクロックのサポートをアプリに追加する前に、アプリのユースケースが次の代替ソリューションのいずれかをサポートしているかどうかを検討してください。

  • アプリで長時間実行の HTTP ダウンロードを実行している場合は、DownloadManager の使用を検討してください。

  • アプリが外部サーバーからデータを同期している場合は、同期アダプターの作成を検討してください。

  • アプリがバックグラウンド サービスに依存している場合は、JobScheduler または Firebase Cloud Messaging を使用して、これらのサービスを特定の間隔でトリガーすることを検討してください。

  • コンパニオン デバイスが通信範囲内にあるときは常にコンパニオン アプリを実行し続ける必要がある場合は、コンパニオン デバイス マネージャーを使用します。

画面をオンのままにする

特定のアプリ(ゲームや映画アプリなど)では画面をオンのままにする必要があります。そのためのおすすめの方法は、アクティビティ内で FLAG_KEEP_SCREEN_ON を使用することです(アクティビティ内でのみ使用し、サービスや他のアプリ コンポーネント内では使用しません)。次に例を示します。

Kotlin

class MainActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
    }
}

Java

public class MainActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  }
}

このアプローチの利点は、ウェイクロック(CPU をオンのままにするを参照)とは異なり、特別な権限を必要とせず、プラットフォームによってアプリ間のユーザーの移動が正しく管理されることです。アプリで未使用のリソースの解放を気にする必要はありません。

アプリのレイアウト XML ファイルで android:keepScreenOn 属性を使用して、これを実装する方法もあります。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:keepScreenOn="true">
    ...
</RelativeLayout>

android:keepScreenOn="true" の使用は、FLAG_KEEP_SCREEN_ON の使用と同等です。アプリに最適な方法を使用できます。アクティビティでフラグをプログラムで設定する利点は、後でフラグをプログラムでクリアして、画面をオフにできるという点です。

テレビの背景モード

テレビでは、FLAG_KEEP_SCREEN_ON を使用して、アクティブな動画再生中にデバイスが背景モードに移行しないようにしてください。フォアグラウンド アクティビティで FLAG_KEEP_SCREEN_ON が設定されていない場合、デバイスは一定時間操作されず自動的に背景モードに入ります。

CPU をオンのままにする

デバイスがスリープ状態になる前になんらかの処理を完了するために CPU を稼働させておく必要がある場合は、wake lock と呼ばれる PowerManager システム サービス機能を使用できます。wake lock を使用すると、アプリはホストデバイスの電源状態を制御できます。

wake lock を作成して保持すると、ホストデバイスのバッテリー駆動時間に重大な影響を及ぼす可能性があります。したがって、wake lock は本当に必要な場合にのみ使用し、できる限り短く保持してください。たとえば、アクティビティで wake lock を使用する必要はありません。前述のように、アクティビティで画面をオンのままにする場合は、FLAG_KEEP_SCREEN_ON を使用します。

wake lock を使用する正当な理由として、画面がオフのときに動作するために CPU を実行し続けるために wake lock を取得する必要があるバックグラウンド サービスが挙げられます。ただし、電池寿命に影響するため、この方法は最小限に抑える必要があります。

wake lock を使用するには、まずアプリのマニフェスト ファイルに WAKE_LOCK 権限を追加します。

<uses-permission android:name="android.permission.WAKE_LOCK" />

サービスを使用してなんらかの処理を行うブロードキャスト レシーバがアプリに含まれている場合、wake lock を直接設定する手順は次のとおりです。

Kotlin

val wakeLock: PowerManager.WakeLock =
        (getSystemService(Context.POWER_SERVICE) as PowerManager).run {
            newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp::MyWakelockTag").apply {
                acquire()
            }
        }

Java

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
        "MyApp::MyWakelockTag");
wakeLock.acquire();

wake lock を解除するには、wakelock.release() を呼び出します。これにより、クレームが CPU に取り下げられます。バッテリーの消耗を避けるため、アプリで wake lock を使い終わったらすぐに解放することが重要です。