【Android】BroadcastReceiverでネットワークの接続状況を監視する
- 2013.09.25.
こんにちわ。pencoです。
今回はBroadcastReceiverを使ってネットワークの接続状況を監視する方法について書いていきたいと思います。
流れとしては、
- ネットワークの接続の変更を通知するBroadcast intentを受信するレシーバを用意する
- ネットワークの接続状況を確認する
- 状況に応じてActivityにコールバックを返す
こんな感じです。
1. レシーバの用意
ではさっそく。
ネットワークの接続の変更を通知するBroadcast intentを受信するレシーバを用意します。コンストラクタの引数については後程説明します。
public class ConnectionReceiver extends BroadcastReceiver {
public ConnectionReceiver(Observer observer) {
//コンストラクタ
}
@Override
public void onReceive(Context context, Intent intent) {
//Broadcast intentを受信
}
}
今回はメインのActivityでのみ使用するので、Activityでレシーバの設定をします。
以下のコードをonCreateに書いています。
IntentFilter filter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
ConnectionReceiver receiver = new ConnectionReceiver(this);
registerReceiver(receiver, filter);
これでBroadcast intent「android.net.conn.CONNECTIVITY_CHANGE」を受信するレシーバが用意できました。
2. ネットワークの接続状況を確認
次にレシーバでネットワーク状況を確認します。
先程作ったレシーバクラスのonReceive()メソッドの中身を変更していきます。
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = manager.getActiveNetworkInfo();
if (info == null) {
//接続していない
}else {
//接続している
}
}
ネットワークの接続状況を確認するためにConnectivityManagerをSystemServiceから取得します。これを行うためにはマニフェストへのパーミッションの記述が必要です。
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
取得したConnectivityManagerを使用してNetworkInfoを取得します。
ネットワーク接続がない場合ではNetworkInfoはnullを返します。
これで、接続しているか否かが判断できたので、最後にActivityにコールバックします。
3. 状況に応じてActivityにコールバックを返す
レシーバクラスにコールバック用のinterfaceを追加します。
レシーバクラスの全体はこんな感じです。
public class ConnectionReceiver extends BroadcastReceiver {
private Observer mObserver;
public ConnectionReceiver(Observer observer) {
mObserver = observer;
}
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = manager.getActiveNetworkInfo();
if (info == null) {
mObserver.onDisconnect();
}else {
mObserver.onConnect();
}
}
//----- コールバックを定義 -----
interface Observer {
void onConnect();
void onDisconnect();
}
}
先程説明を省いたコンストラクタについてですが、
この引数にはコールバックinterfaceを実装したクラスが入ります。
つまり今回はActivityが入ります。
レシーバの設定を行う際に以下の様に記述し、コールバック先を自身に設定しているので、ActivityではConnectionReceiver.Observerをimplementsする必要があります。
ConnectionReceiver receiver = new ConnectionReceiver(this);
あとはActivityで実装したコールバックメソッドで適宜必要な処理を行います。
@Override
public void onConnect() {
//ネットワークに接続した時の処理
}
@Override
public void onDisconnect() {
//ネットワークが切断された時の処理
}
本日はここまで。