ネットワーク データ使用量を最適化する

スマートフォンのライフサイクル全体では、モバイルデータ通信プランのコストが端末自体のコストを簡単に上回ります。 Android 7.0(API レベル 24)から、端末のデータ使用量を最適化し、データの使用を抑えるために端末全体でデータセーバーを有効にできます。 この機能は、ローミング時、課金サイクルの終了間近、または短期間のデータパックで特に有効です。

ユーザーが [Settings] でデータセーバーを有効にし、端末が従量制課金ネットワークに接続されている場合、システムはバックグラウンドでのデータ使用をブロックし、フォアグラウンドでのデータ使用をなるべく抑えるようにアプリに指示します。 ユーザーは特定のアプリをホワイトリストに登録することにより、データセーバーがオンになっているときでも、バックグラウンドで従量制課金接続を使用できます。

N Developer Preview は ConnectivityManager API を拡張することで、ユーザーのデータセーバー設定を取得する方法と、設定の変更を監視する方法を提供しています。 アプリでユーザーがデータセーバーを有効にしているかどうかを確認し、フォアグラウンドおよびバックグラウンドでのデータ使用を抑えるようにすることをお勧めします。

データセーバー設定の確認

N Developer Preview では、アプリは ConnectivityManager API を使用して、どのようなデータ使用量の制限が適用されているかを確認できます。 getRestrictBackgroundStatus() メソッドは以下のいずれかの値を返します。

RESTRICT_BACKGROUND_STATUS_DISABLED
データセーバーは無効になっています。
RESTRICT_BACKGROUND_STATUS_ENABLED
ユーザーはこのアプリのデータセーバーを有効にしています。アプリはフォアグラウンドでのデータ使用を抑えるようにし、バックグラウンドでのデータ使用に対する制限を適切に処理する必要があります。
RESTRICT_BACKGROUND_STATUS_WHITELISTED
ユーザーはデータセーバーを有効にしていますが、アプリがホワイトリストに登録されています。アプリは、フォアグラウンドおよびバックグラウンドでのデータ使用を引き続き抑えるようにする必要があります。

データセーバーが無効になっている場合や、アプリがホワイトリストに登録されている場合でも、端末が従量制課金ネットワークに接続されている場合は、データ使用量を抑えることをお勧めします。 以下のサンプルコードでは、アプリで使用する必要があるデータ量を確認するために、ConnectivityManager.isActiveNetworkMetered()ConnectivityManager.getRestrictBackgroundStatus() を使用しています。

ConnectivityManager connMgr = (ConnectivityManager)
        getSystemService(Context.CONNECTIVITY_SERVICE);
// Checks if the device is on a metered network
if (connMgr.isActiveNetworkMetered()) {
  // Checks user’s Data Saver settings.
  switch (connMgr.getRestrictBackgroundStatus()) {
    case RESTRICT_BACKGROUND_STATUS_ENABLED:
    // Background data usage is blocked for this app. Wherever possible,
    // the app should also use less data in the foreground.

    case RESTRICT_BACKGROUND_STATUS_WHITELISTED:
    // The app is whitelisted. Wherever possible,
    // the app should use less data in the foreground and background.

    case RESTRICT_BACKGROUND_STATUS_DISABLED:
    // Data Saver is disabled. Since the device is connected to a
    // metered network, the app should use less data wherever possible.
  }
} else {
  // The device is not on a metered network.
  // Use data as required to perform syncs, downloads, and updates.
}

ホワイトリスト パーミッションの要求

アプリがバックグラウンドでデータを使用する必要がある場合は、アプリのパッケージ名(例: package:MY_APP_ID)の URI を含む Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS インテントを送信することでホワイトリスト パーミッションをリクエストできます。

インテントと URI を送信すると、[Settings] アプリが起動し、アプリのデータ使用量の設定が表示されます。 ユーザーはアプリのバックグラウンドデータを有効にするかどうかを決めることができます。 このインテントを送信する前に、バックグラウンドでのデータ使用を有効にするために [Settings] アプリを起動するかどうかを最初にユーザーに尋ねることをお勧めします。

データセーバー設定の変更の監視

アプリでデータセーバー設定の変更を監視するには、BroadcastReceiver を作成して ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED をリッスンし、レシーバーを動的に Context.registerReceiver() に登録します。 このブロードキャストを受信したアプリは、ConnectivityManager.getRestrictBackgroundStatus() を呼び出して、新しいデータセーバー設定がそのパーミッションに影響を及ぼすかどうかを確認する必要があります。

注: このブロードキャストは、Context.registerReceiver() を使用して動的に登録するアプリにのみ送信されます。 マニフェストにこのブロードキャストを受信するために登録するアプリはこれらを受信しません。

Android Debug Bridge コマンドを使用したテスト

Android Debug Bridge(ADB)には、データセーバーが有効な状態でアプリをテストするために使用できるコマンドがいくつか用意されています。 ネットワーク パーミッションの確認と設定や、ワイヤレス ネットワークを従量制に設定して、従量制ではないネットワークでのアプリのテストができます。

$ adb shell dumpsys netpolicy
現在のバックグラウンド ネットワーク全体の制限設定、ホワイトリスト内の現在のパッケージ UID、その他の既知のパッケージのネットワーク パーミッションを含むレポートが生成されます。
$ adb shell cmd netpolicy
ネットワーク ポリシー マネージャ(netpolicy)のコマンドの一覧が表示されます。
$ adb shell cmd netpolicy set restrict-background <boolean>
true または false をそれぞれ渡したときに、データセーバー モードを有効または無効にします。
$ adb shell cmd netpolicy add restrict-background-whitelist <UID>
指定されたパッケージ UID をホワイトリストに追加し、バックグラウンドで従量制課金接続を使用できるようにします。
$ adb shell cmd netpolicy remove restrict-background-whitelist <UID>
指定されたパッケージ UID をホワイトリストから削除し、データセーバーが有効な場合でもバックグラウンドで従量制課金接続を使用できないようにします。
$ adb shell cmd netpolicy list wifi-networks
すべての WiFi ネットワークについて従量制かどうかを一覧表示します。
$ adb shell cmd netpolicy set metered-network <WIFI_SSID> true
指定された SSID の WiFi を従量制に設定し、従量制でないネットーワークで従量制ネットワークをシミュレートできるようにします。