バックグラウンドデータの設定項目はAndroid 4.0で挙動が大きく変化

今回の連載「スマホのちょっと深いとこ」は、前回のスリープ中のWi-Fi設定に続いてAndroidの通信設定について紹介します。Androidスマートフォンやタブレットに存在する「バックグラウンドデータ」という設定項目をご存知でしょうか。名前だけを見れば、アプリがバックグラウンド状態(=画面が表示されていない状態)でデータ通信できるかどうかを設定できるように読めます。

ただ、Androidの歴史を紐解いていくと、必ずしもそうと言い切れない、興味深い事実が見えてきます。今回は知っておくとちょっと便利かもしれないバックグラウンドデータの話題を掘り下げて見てみましょう。

【まずバックグラウンドデータの設定項目がある場所を確認】

バックグラウンドデータの設定項目がある個所は機種やOSバージョンにより異なりますが、例えば、Android 2.3(「Xeria arc SO-01C」で確認)では「設定」→「アカウントと同期」メニューにあります。また、Android 4.0(「GALAXY SII WiMAX ISW11SC」で確認)では「設定」→「データの使用」画面のメニューに「バックグラウンドを制限」項目があります(*1)。

*1: Android 4.0以降ではこのメニュー以外にも、アプリごとにバックグラウンドデータのON/OFFを設定できるようになっています。

android_background_001
バックグラウンドデータの設定項目がある場所はさまざま

【Android 4.0未満ではバックグラウンドデータ制御がアプリ任せ】

Android 4.0未満のバージョンでは、バックグラウンドデータの設定がON/OFFのどちらになっているかをアプリから取得する方法(*2)がありましたが、実際に通信できるかどうかはそれとは無関係でした。すなわち、バックグラウンドデータの設定がONだろうがOFFだろうが、実際にはバックグラウンドでデータ通信を行うことができました

*2: アプリ開発者の方には「API」といったほうがわかりやすいでしょう。該当APIはConnectivityManagerクラスのgetBackgroundDataSettingメソッドとなります。

Googleが開発者向けに公開しているドキュメントでは、この件について以下のように書かれています。

もしバックグラウンドデータの設定がOFFになっているときは、アプリケーションはバックグラウンド状態でデータ通信を行うべきではない。開発者はこの設定を尊重すべきであり、バックグラウンド状態でのデータ通信を行う前にこの設定をチェックするべきである。

つまりバックグラウンドデータの設定を参照してデータ通信を行うかどうかを決める処理がアプリに任されていたわけです。Googleが言うところの「するべき」動作に従う「行儀のよいアプリ」はバックグラウンドデータ設定がOFFの時にバックグラウンドデータ通信を行いませんが、その一方で「行儀の悪いアプリ」はそんなの関係ねぇと言わんばかりにバックグラウンドデータで通信してしまえる状態だったわけです。

検証のため、定期的にデータ通信を行ってサーバーから取得した現在時刻を表示するアプリを作ってみました(*3)。Android 2.3の機種(「Xperia arc SO-01C」で確認)でこのアプリを動かしてみたところ、バックグラウンドデータの設定がOFFになっているにも関わらず、バックグラウンドでサーバーとデータ通信を行って現在時刻が取得できることが確認できました(*4)。

*3: 【開発者用注釈】現在時刻を文字列で出力するシンプルなPHPファイルをWebサーバーに配置し、アプリからHTTPでアクセスして現在時刻の文字列を取得しています。バックグラウンドでの動作にはServiceを使用しています。

*4: この検証用アプリは「行儀の悪い」アプリと言えます。

android_background_002
Android 2.3ではバックグラウンドデータの設定が無効でもバックグラウンドデータ通信ができてしまう (写真左:フォアグラウンド、写真右:バックグラウンド、写真右でバックグラウンドデータ設定がOFFになっている点に注目)

【Android 4.0以上ではOSがバックグラウンドデータを制御】

こんな状態では行儀の悪いアプリにバックグラウンドデータ通信され放題になってしまうと思ったのか、Android 4.0において仕様が変更されました。まず「バックグラウンドデータの設定がON/OFFのどちらになっているかをアプリから取得する方法」は非推奨とされ、設定内容にかかわらず常にONと取得されるようになりました。その代わり、バックグラウンドデータの設定がOFFになっているときにはアプリがバックグラウンドでデータ通信を試みても失敗するようになりました。つまり、バックグラウンドで実際にデータ通信させるかどうかの制御をアプリではなくOS自身が行うようになったわけです。

先ほどの検証アプリをAndroid 4.0の機種(「GALAXY SII WiMAX ISW11SC」で確認)で動作させたところ、バックグラウンドデータの設定がOFFになっているときには実際に通信が失敗することが確認できました。

android_background_003
Android 4.0ではバックグラウンドデータが無効の場合はOSがバックグラウンドデータ通信を許さないようになっている(写真左:フォアグラウンド、写真右:バックグラウンド)

【まとめ:Android 4.0未満の機種では注意が必要】

「バックグラウンドデータ」設定についてまとめると以下のようになります。

・Android 4.0未満:バックグラウンドデータOFFの時に本当にバックグラウンドでデータ通信しないかどうかはアプリ(の開発者)にゆだねられており、行儀の悪いアプリは設定を無視してバックグラウンドデータ通信が可能だった
・Android 4.0以上:バックグラウンドデータOFFの時にはOSが強制的にバックグラウンドでのデータ通信を制限するようになった

iOSなどと比較して比較的アプリの自由度が高いといわれているAndroidですが、バックグラウンドデータの判定をアプリに任せるのはさすがに自由度が高すぎたというGoogleの判断でしょうか。Android 4.0未満の利用者は、バックグラウンドデータOFFの設定をアプリが守っているとは限らない点に注意が必要です。


■関連リンク
エスマックス(S-MAX)
エスマックス(S-MAX) smaxjp on Twitter
S-MAX - Facebookページ
連載『吉川英一の「スマホのちょっと深いとこ」』記事一覧 - S-MAX
今日の気分はバリいくつ?