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

電池寿命への影響に関しては、すべての接続タイプが同じわけではありません。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;
    }