接続タイプに基づいてダウンロード パターンを変更する

電池寿命への影響に関しては、すべての接続タイプが同じわけではありません。Wi-Fi 無線は他の無線通信よりも電池の使用量が大幅に少ないですが、それだけでなく、さまざまな無線通信技術で使用される無線方式はそれぞれ電池にもたらす影響が異なります。

Wi-Fi を使用する

ほとんどの場合、Wi-Fi 無線は、大幅に低い電池コストでより大きな帯域幅を提供します。 そのため、可能な限り、Wi-Fi 経由で接続しているときにデータ転送を実行することをおすすめします。

ブロードキャスト レシーバを使用すると、接続の変更をリッスンすることができます。これにより、Wi-Fi 接続が確立されているかどうかを特定して、重要なダウンロードを実行したり、予定されていた更新をプリエンプトしたりできるほか、定期的な更新の頻度を一時的に増やすこともできます。詳しくは、接続ステータスと接続タイプの特定をご覧ください。

より広い帯域幅を使用して、より多くのデータをより少ない頻度でダウンロードする

無線通信経由で接続する場合は、一般に、帯域幅が広いほど電池コストが高くなります。つまり、通常、LTE は 3G よりも多くのエネルギーを消費し、3G は 2G よりもコストがかかります。

つまり、基盤となる無線通信のステートマシンは無線技術に応じて変化しますが、一般に、状態変化のテールタイムがもたらす相対的な電池への影響は、無線の帯域幅が広いほど大きくなります。

その一方で、帯域幅が広い方がより積極的にプリフェッチできるので、同じ時間でより多くのデータをダウンロードできます。あまり直観的ではありませんが、テールタイムの電池コストは比較的高いため、更新の頻度を減らすには、各転送セッションで無線をアクティブにしておく時間を長くする方がより効率的です。

たとえば、LTE 無線の帯域幅が 3G の 2 倍で、エネルギー コストが 2 倍である場合、各セッション中に 4 倍のデータ(可能性としては 10 MB のデータ)をダウンロードできるはずです。これほどのデータをダウンロードする場合は、利用可能なローカル ストレージにプリフェッチが与える影響を考慮し、プリフェッチ キャッシュを定期的にフラッシュすることが重要です。

接続マネージャーを使用すると、アクティブな無線を判断し、それに応じてプリフェッチのルーティンを変更できます。

Kotlin

    val cm = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

    val tm = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager

    val activeNetwork: NetworkInfo? = cm.activeNetworkInfo

    val prefetchCacheSize: Int = when (activeNetwork?.type) {
        ConnectivityManager.TYPE_WIFI -> MAX_PREFETCH_CACHE
        ConnectivityManager.TYPE_MOBILE -> {
            when (tm.networkType) {
                TelephonyManager.NETWORK_TYPE_LTE or TelephonyManager.NETWORK_TYPE_HSPAP ->
                    DEFAULT_PREFETCH_CACHE * 4
                TelephonyManager.NETWORK_TYPE_EDGE or TelephonyManager.NETWORK_TYPE_GPRS ->
                    DEFAULT_PREFETCH_CACHE / 2
                else -> DEFAULT_PREFETCH_CACHE
            }
        }
        else -> DEFAULT_PREFETCH_CACHE
    }
    

Java

    ConnectivityManager cm =
     (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);

    TelephonyManager tm =
      (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);

    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();

    int PrefetchCacheSize = DEFAULT_PREFETCH_CACHE;

    switch (activeNetwork.getType()) {
      case (ConnectivityManager.TYPE_WIFI):
        PrefetchCacheSize = MAX_PREFETCH_CACHE; break;
      case (ConnectivityManager.TYPE_MOBILE): {
        switch (tm.getNetworkType()) {
          case (TelephonyManager.NETWORK_TYPE_LTE |
                TelephonyManager.NETWORK_TYPE_HSPAP):
            PrefetchCacheSize *= 4;
            break;
          case (TelephonyManager.NETWORK_TYPE_EDGE |
                TelephonyManager.NETWORK_TYPE_GPRS):
            PrefetchCacheSize /= 2;
            break;
          default: break;
        }
        break;
      }
      default: break;
    }