Learn to Live and Live to Learn

IT(たまにビジネス)に関する記事を読んで、考えて、使ってみたことをまとめる場。

Android N データセーバ対応

データセーバとは

Android Nで導入された機能です.

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

データ通信に制限がかかって月後半に困る人(それは私)には便利な機能かもしれませんね.
ただし,アプリ開発者側はバックグランドでしていた処理ができなくなるので対応が求められます.

データセーバ設定の確認&ホワイトリストパーミッションの要求

一番使うのはこれだと思います.データセーバが有効になっているか確認し,有効な時はホワイトリストに自アプリを登録してもらう設定画面に遷移させます.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
    ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    if (connectivityManager.isActiveNetworkMetered()
        && Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        // 現在の通信が測定されているか(ダウンロードにリミットが課されているか)
        switch (connectivityManager.getRestrictBackgroundStatus()) {
            case ConnectivityManager.RESTRICT_BACKGROUND_STATUS_ENABLED:
                // データセーバ有効
                // 設定画面へ遷移
                Intent intent = new Intent(Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS, "package:<package_name>");
                startActivity(intent);
            case ConnectivityManager.RESTRICT_BACKGROUND_STATUS_WHITELISTED:
                // ホワイトリストに登録されている
            case ConnectivityManager.RESTRICT_BACKGROUND_STATUS_DISABLED:
                // データセーバ無効
        }
    } else {
        // WiFiとかデータセーバには関係ない
    }
}

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

BroadcastReceiverを使ってデータセーバ設定の変更を検知することもできます.
ただし,AndroidManifest.xmlに書く静的な登録ではなく,registerRecieverする動的な登録でないとこのブロードキャストは受信できません.

IntentFilter filter = new IntentFilter();
filter.addAction(ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED);
filter.addAction(conManager.ACTION_RESTRICT_BACKGROUND_CHANGED);
DataSaverReceiver receiver = new DataSaverReceiver();
getContext().registerReceiver(receiver, filter);
public class DataSaverReceiver extends BroadcastReceiver{
    public void onReceive(Context context, Intent intent) {
        // データセーバ設定が変更された時
    }
}

参考

developer.android.com

www.webprofessional.jp