アプリの休止状態

アプリが Android 11(API レベル 30)以上をターゲットとしている場合、数か月間アプリを操作しないと、アプリは休止状態になります。パフォーマンスではなく保存容量に合わせて最適化され、ユーザーデータは保護されます。このシステム動作は、ユーザーがシステム設定からアプリを手動で強制停止した場合と同様の動作です。

休止状態の影響

休止状態の影響は、表 1 に示すとおり、アプリのターゲット SDK のバージョンと、アプリが実行されているデバイスによって異なります。

表 1. 休止状態がアプリに及ぼす影響
ターゲット SDK のバージョン デバイスの特性 休止状態の影響
Android 12 以上 Android 12 以上を搭載

アプリの実行時の権限はリセットされます。このアクションは、ユーザーがシステム設定で権限を表示してアプリのアクセスレベルを [拒否] に変更するのと同じ効果があります。

アプリはバックグラウンドでジョブやアラートを実行できません。

アプリはプッシュ通知(Firebase Cloud Messaging を介して送信される優先度の高いメッセージなど)を受信できません。

アプリのキャッシュ内のファイルはすべて削除されます。

Android 11 Android 11 を搭載 アプリの実行時の権限がリセットされます。
Android 11 Android 6.0(API レベル 23)から Android 10(API レベル 29)までを搭載し、Google Play 開発者サービスが有効にされている。

アプリの実行時の権限がリセットされます。

この動作は 2021 年 12 月に適用されます。詳しくは、何十億台ものデバイスで許可のオートリセットを利用可能にする方法についてのブログ投稿をご覧ください。

アプリが休止状態を終了するときのシステム動作

ユーザーが次にアプリを操作すると、アプリは休止状態を終了し、再びジョブ、アラート、通知を作成できるようになります。

ただし、以下の処理がアプリに対して行われることはありません。

  1. アプリの実行時の権限を再付与する。

    ユーザーがアプリに再付与する必要があります。

  2. アプリが休止状態になる前にスケジュールされたジョブ、アラート、通知のスケジュールを再設定する。

    このワークフローを簡単にサポートするには、WorkManager を使用します。また、ACTION_BOOT_COMPLETED ブロードキャスト レシーバにスケジュール変更ロジックを追加することもできます。このブロードキャスト レシーバは、アプリが休止状態を終了したときや、デバイスが起動した後に呼び出されます。

アプリの使用

以降のセクションでは、アプリの使用の例と、システムがアプリの使用と見なさない操作の例を示します。

アプリの使用の例

アプリのアクティビティが再開されると、システムはこのイベントをユーザー操作と見なします。そのため、アプリが休止状態になるまでの時間が延長されます。

Android 11 以上では、以下の動作もユーザー操作と見なされます。

  • ユーザーがウィジェットを操作する。
  • ユーザーが通知を操作する(通知を閉じる以外)。

休止状態のアプリの使用には、明示的にユーザーの操作は必要ありません。パッケージのコンポーネントが呼び出されている限り、アプリの使用と見なされます。いくつかの例を示します。

  • サービスまたはコンテンツ プロバイダが、デバイス上または OS 上の別のアプリによってバインドされているアプリ。たとえば、インプット メソッド エディタ(IME)やパスワード マネージャーなどです。
  • 外部パッケージから明示的なブロードキャストを受信するパッケージ内のブロードキャスト レシーバ。

あてはまらない例

アプリが下記のリストに記載された動作のみを示す場合、数か月後に休止状態になります。

休止状態からのシステム除外

Android では、特定のユースケースにおいて、アプリ休止状態の対象からシステムレベルで除外します。アプリが以下のいずれかのカテゴリに属する場合、アプリ使用の基準から除外され、休止状態になりません。

ランチャーに表示されていないアプリ
アクティブなショートカット タイルがランチャーにないアプリ。
仕事用プロファイルのアプリ
ユーザーが仕事用プロファイルにインストールしているすべてのアプリ。同じアプリが個人用プロファイルにも存在する場合は、仕事用プロファイルのアプリのみが除外されます。
Device Policy Controller
ローカル デバイス ポリシーとデバイス上のシステムアプリを制御するアプリ。
携帯通信会社の特権アプリ
携帯通信会社がデバイスにプリロードしていて、契約上のサービス義務として必要だと見なされるアプリ(ボイスメールやカスタマー サービス アプリなど)。
サードパーティのインストーラ アプリ
必要に応じてインストール済みのアプリを自動更新するサードパーティ アプリストア。

休止状態からのユーザー除外

アプリのコア ユースケースが休止状態により影響を受けると思われる場合は、ユーザーによるアプリの休止状態の除外をリクエストできます。この除外は、アプリが主にバックグラウンドで(アプリを操作していない場合でも)動作することをユーザーが予期している状況で役立ちます。たとえば、アプリが次のいずれかを行っている場合などです。

  • 家族の現在地を定期的に報告して、家族の安全を確保する。
  • デバイスとアプリのサーバーの間でデータを同期する。
  • テレビなどのスマート デバイスと通信する。
  • スマートウォッチなどのコンパニオン デバイスとペア設定する。

除外をリクエストするには、次のセクションの手順を完了します。

ユーザーがアプリの休止状態をすでに無効にしているかどうかを確認する

ユーザーがアプリの休止状態をすでに無効にしているかどうか確認するには、getUnusedAppRestrictionsStatus() API を使用します。

アプリでこの API を使用する方法について詳しくは、このページの API のコード例をご覧ください。

アプリの休止状態を無効にするようユーザーに依頼する

ユーザーがまだアプリの休止状態を無効にしていない場合は、ユーザーにリクエストを送信できます。手順は次のとおりです。

  1. アプリの休止状態を無効にする必要がある理由をユーザーに説明する UI を表示します。
  2. API のコード例に示すように、createManageUnusedAppRestrictionsIntent() API を呼び出します。この API は、[設定] の [アプリ情報] 画面を読み込むインテントを作成します。ここから、ユーザーはアプリの休止状態をオフにできます。

    このインテントを送信する場合は、startActivity() ではなく startActivityForResult() を呼び出すことが重要です。

    表 2 に示すように、オプションの場所と名前は、アプリがインストールされているデバイスの特性によって異なります。

    表 2. アプリの休止状態を無効にするオプション
    デバイスの特性 オプションが表示されるページ 無効にするオプションの名前
    Android 13 以上を搭載 アプリ情報 使用していないアプリを一時停止する
    Android 12 を搭載 アプリ情報 権限を削除して空き容量を増やす
    Android 11 を搭載 [アプリ情報] > [権限] アプリが使用されていない場合の権限の削除
    Android 6.0 から Android 10 までを搭載し、Google Play 開発者サービスが有効にされている。 Play アプリ > メニュー > [Play プロテクト] > [使用していないアプリの権限] アプリが使用されていない場合の権限の削除

API のコード例

このコード例は、アプリで休止状態が有効になっているかどうかを確認する方法と、アプリの休止状態を無効にするようにユーザーに依頼する正しい方法を示しています。

Kotlin

val future: ListenableFuture<Int> =
    PackageManagerCompat.getUnusedAppRestrictionsStatus(context)
future.addListener({ onResult(future.get()) }, ContextCompat.getMainExecutor(context))

fun onResult(appRestrictionsStatus: Int) {
  when (appRestrictionsStatus) {
    // Couldn't fetch status. Check logs for details.
    ERROR -> { }

    // Restrictions don't apply to your app on this device.
    FEATURE_NOT_AVAILABLE -> { }

    // The user has disabled restrictions for your app.
    DISABLED -> { }

    // If the user doesn't start your app for a few months, the system will
    // place restrictions on it. See the API_* constants for details.
    API_30_BACKPORT, API_30, API_31 -> handleRestrictions(appRestrictionsStatus)
  }
}

fun handleRestrictions(appRestrictionsStatus: Int) {
  // If your app works primarily in the background, you can ask the user
  // to disable these restrictions. Check if you have already asked the
  // user to disable these restrictions. If not, you can show a message to
  // the user explaining why permission auto-reset or app hibernation should be
  // disabled. Then, redirect the user to the page in system settings where they
  // can disable the feature.
  val intent = IntentCompat.createManageUnusedAppRestrictionsIntent(context, packageName)

  // You must use startActivityForResult(), not startActivity(), even if
  // you don't use the result code returned in onActivityResult().
  startActivityForResult(intent, REQUEST_CODE)
}

以前のプラットフォームの API

オペレーティング システムには、休止状態機能を操作する API も含まれています。ただし、この API は Android 11 以上を搭載したデバイスでのみ動作します。以前の Android バージョンにバックポートされた休止状態機能には対応していません。そのため、この API の使用はおすすめしません。

互換性のために、この API を一時的に使用する必要がある場合は、以下の方法で使用します。

手動で休止状態の動作を呼び出す

システムがアプリを休止状態にした後、アプリがどのように動作するかをテストする手順は、次のとおりです。

  1. (Android 12 以上のみ)デバイスで休止状態の動作を有効にします。

    adb shell device_config put app_hibernation app_hibernation_enabled true
    
  2. 休止状態に入るまでシステムが待機する時間のデフォルトを設定します。次のようにすると、テスト後の復元が可能になります。

    threshold=$(adb shell device_config get permissions \
      auto_revoke_unused_threshold_millis2)
    
  3. システムが待機する時間を短縮します。次の例では、アプリの操作を中断して 1 秒後にアプリが休止状態に入るようにシステムが変更されています。

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 1000
    
  4. 次のコマンドを実行して、テストデバイスで起動時のブロードキャストが終了するのを待ちます。

    adb shell am wait-for-broadcast-idle
    

    ブロードキャストが終了すると、このコマンドは「All broadcast queues are idle!」というメッセージを返します。

  5. アプリの休止状態のプロセスを手動で呼び出します。

    adb shell cmd jobscheduler run -u 0 -f \
      com.google.android.permissioncontroller 2
    
  6. (Android 12 以上のみ)次のいずれかの方法で、アプリが休止状態になっていることを確認します。

    • テストデバイスで、未使用のアプリを休止することを示す通知が表示されていることを確認します。
    • 次のコマンドを実行します。

      adb shell cmd app_hibernation get-state PACKAGE-NAME
      
  7. システムがアプリを休止状態にするまで待機する時間のデフォルトを復元します。

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 $threshold