バックグラウンド処理に関するシステム制限

バックグラウンド プロセスは、メモリと電池を大量に消費することがあります。たとえば、 暗黙的なブロードキャストにより、API 呼び出しに登録されている多くのバックグラウンド プロセスが プロセスがあまり役に立たなくても、リッスンします。たとえば デバイスのパフォーマンスとユーザー エクスペリエンスの両方に大きく影響します。

システムの制限を回避するには、 バックグラウンド タスクを実行します。「 バックグラウンド タスクの概要のドキュメントでは、 最適な API を選択できます

ユーザーが開始する制限

アプリが Android Vitals に記載されている不正な動作の一部を示している場合は、 そのアプリのシステム リソースへのアクセスを制限するように、システムがユーザーに要求します。

アプリが過剰なリソースを消費していることをシステムが検出すると、 ユーザーに許可し、アプリのアクションを制限することもできます。 この通知のトリガーとなる動作には、次のようなものがあります。

  1. 過度の wake lock: 画面が ON のときに 1 時間部分的な wake lock が 1 回繰り返されます オフ
  2. 過度のバックグラウンド サービス: API レベル 26 未満をターゲットとしているアプリ バックグラウンド サービスが過剰に

詳細な制限はデバイス メーカーが決定します。対象 たとえば、AOSP ビルドでは、制限されたアプリはジョブの実行、アラームのトリガー、 (アプリがフォアグラウンドにある場合を除きます)

ネットワーク アクティビティのブロードキャストの受信制限

登録しているアプリは CONNECTIVITY_ACTION ブロードキャストを受信しません。 このブロードキャストに依存するプロセスや、マニフェストで 起動しません。これにより、アプリでネットワーク通信をリッスンする際に問題が発生する可能性があります。 ネットワーク アクティビティの変更や一括実行は、デバイスが 接続しますこの制限を回避するソリューションはすでにいくつか 用意されているものですが、適切なものは、 指定することもできます

定額制接続の処理をスケジュールする

WorkRequest をビルドするときに、NetworkType.UNMETERED Constraint を追加します。

fun scheduleWork(context: Context) {
    val workManager = WorkManager.getInstance(context)
    val workRequest = OneTimeWorkRequestBuilder<MyWorker>()
       .setConstraints(
           Constraints.Builder()
               .setRequiredNetworkType(NetworkType.UNMETERED)
               .build()
           )
       .build()

    workManager.enqueue(workRequest)
}

処理の条件が満たされると、アプリはコールバックを受信して 指定された Worker クラスの doWork() メソッド。

アプリの実行中にネットワーク接続をモニタリングする

実行中のアプリは、引き続き CONNECTIVITY_CHANGE をリッスンできます。 BroadcastReceiver を登録しました。ただし、ConnectivityManager API は 特定のネットワークが指定された場合にのみコールバックをリクエストする 条件が満たされます

NetworkRequest オブジェクトは、ネットワーク コールバックのパラメータを定義します。 利用規約(NetworkCapabilitiesNetworkRequest オブジェクトを作成する この関数を NetworkRequest.Builder クラスに置き換えます。registerNetworkCallback 次に、NetworkRequest オブジェクトをシステムに渡します。ネットワークが 条件が満たされると、アプリは onAvailable() メソッドが ConnectivityManager.NetworkCallback クラス。

アプリは、終了するか、 unregisterNetworkCallback():

画像や動画のブロードキャストの受信制限

アプリが ACTION_NEW_PICTURE を送受信できない、または ACTION_NEW_VIDEO ブロードキャスト。この制限により、インフラストラクチャの 複数のアプリを順番に復帰させる必要がある場合のパフォーマンスとユーザー エクスペリエンスへの影響 処理する必要があります

処理をトリガーしたコンテンツ機関を特定する

WorkerParameters を使用すると、アプリは内容に関する有用な情報を受け取れます。 コンテンツ オーソリティと URI が処理をトリガーしました。

List<Uri> getTriggeredContentUris()

処理をトリガーした URI のリストを返します。次の場合は空になります。 処理をトリガーした URI がない(たとえば、 デッドライン、その他の理由など)、変更された URI の数が 50.

List<String> getTriggeredContentAuthorities()

処理をトリガーしたコンテンツオーソリティの文字列リストを返します。条件 返されたリストが空でない場合は、getTriggeredContentUris() を使用して取得します。 変更された URI の詳細を確認できます。

次のサンプルコードは CoroutineWorker.doWork() メソッドをオーバーライドします。 ジョブをトリガーしたコンテンツ オーソリティと URI を記録します。

class MyWorker(
    appContext: Context,
    params: WorkerParameters
): CoroutineWorker(appContext, params)
    override suspend fun doWork(): Result {
        StringBuilder().apply {
            append("Media content has changed:\n")
            params.triggeredContentAuthorities
                .takeIf { it.isNotEmpty() }
                ?.let { authorities ->
                    append("Authorities: ${authorities.joinToString(", ")}\n")
                    append(params.triggeredContentUris.joinToString("\n"))
                } ?: append("(No content)")
            Log.i(TAG, toString())
        }
        return Result.success()
    }
}

システムの制限を受けたアプリのテスト

メモリの少ないデバイスやメモリが少ない環境で動作するようにアプリを最適化する パフォーマンスとユーザーエクスペリエンスが向上しますバックグラウンドへの依存関係の削除 マニフェストに登録された暗黙的なブロードキャスト レシーバを使用すると、 パフォーマンスが向上しますアプリの動作を最適化し これらのバックグラウンド処理は使用しません

アプリのテストに役立つその他の Android Debug Bridge(ADB)コマンド 無効にした場合の動作は次のようになります。

  • 暗黙的なブロードキャストとバックグラウンド サービスが 使用できない場合は、次のコマンドを入力します。

    $ adb shell cmd appops set <package_name> RUN_IN_BACKGROUND ignore

  • 暗黙的なブロードキャストとバックグラウンド サービスを再度有効にするには、次のように入力します。 command:

    $ adb shell cmd appops set <package_name> RUN_IN_BACKGROUND allow

アプリをさらに最適化する

バックグラウンド タスクを最適化するその他のおすすめの方法については、をご覧ください。 タスク スケジューリング API のバッテリー使用を最適化する ご覧ください