Wifiが繋がったらサービスを呼び出すレシーバー

Wifiが繋がったらサービスを呼び出すレシーバー

Wifiに関係するブロードキャストインテントを受け取るレシーバーを作るとき、2通りの作り方があったので記しておきます。

前提として、どちらもAndroidManifest.xmlに以下のパーミッションを入れるのを忘れないように。

 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

①端末でのWifiのオン、オフボタンは関係なく、Wifiに繋がったときにレシーバーが呼び出されるパターン

・AndroidManifest.xmlにレシーバーを登録。

 <receiver
            android:name="ほにゃららReceiver"
            android:enabled="true" >
            <intent-filter>
                <action android:name="android.net.wifi.STATE_CHANGE" >
                </action>
            </intent-filter>
 </receiver>

・レシーバーの中身

 public class ほにゃららReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction())) {
Bundle extras = intent.getExtras();
if (extras != null) {
NetworkInfo info = extras
.getParcelable(WifiManager.EXTRA_NETWORK_INFO);
if (info != null) {
if (info.getState().equals(NetworkInfo.State.CONNECTED)) {
Log.d(TAG, “レシーバーが呼び出されたよ”);
// サービス呼び出し
context.startService(new Intent(context,
ほにゃららService.class));
}
}
}
}
}

 }

②Wifiに繋がったかは関係なく、端末でWifiボタンがオンにされた瞬間にレシーバーが呼び出されるパターン

・AndroidManifest.xmlにレシーバーを登録。

 <receiver
            android:name="ほにゃららReceiver"
            android:enabled="true" >
            <intent-filter>
                <action android:name="android.net.wifi.WIFI_STATE_CHANGED" >
                </action>
            </intent-filter>
 </receiver>

intent-filterが先ほどのと微妙に違うのに注意。

・レシーバーの中身

 public class ほにゃららReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction())) {
WifiManager wm = (WifiManager) context
.getSystemService(Context.WIFI_SERVICE);
if (wm.getWifiState() == WifiManager.WIFI_STATE_ENABLED) {
Log.i(TAG, “レシーバーが呼び出されたよ”);
// サービス呼び出し
context.startService(new Intent(context, ほにゃららService.class));
}
}
}

 }

微妙な違いですが、たいていの場合はパターン①を使ったほうがいいと思います。
実体験ですが、パターン②を使っていて、レシーバーが呼び出されるタイミングはWifiが繋がった時だとてっきり思っていましたので、サービス内でのネットワーク処理が上手くいかないという罠にかかりました…

パターン②の方はWifiでのネットワーク処理を始めるときに使うというよりは、他の用途で使うのだと思います。
他の用途が今のところ思いつきませんが…

では、この2つのブロードキャストインテントが発せられるタイミングの差異に皆さんが悩みませんように。

by 芦野輝明
twitter→https://twitter.com/teriyakiegg

Android

  • ありがとうございます! — ありがとう {2017-03-07 (火) 10:42:38}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です