電話がWiFiに接続されるたびにデータベースを更新するアプリがあります。を実装しましたがService
、BroadcastReceiver
これは実行されます(使用中のネットワークがわかります)が、問題は、ネットワークの状態が変化したとき、または何らかの接続が行われたときに、ファイルにService
何を追加して開始するかがわからないことです。ネットワークのmanifest
BroadcastReceiver
5 に答える
あなたが必要です
<intent-filter>
<action android:name="android.net.wifi.WIFI_STATE_CHANGED"/>
<action android:name="android.net.wifi.STATE_CHANGE"/>
</intent-filter>
あなたのreceiver
タグで。
または、登録する前に、より詳細に制御したい場合は、次のようにBroadcastReceiver
設定します。
final IntentFilter filters = new IntentFilter();
filters.addAction("android.net.wifi.WIFI_STATE_CHANGED");
filters.addAction("android.net.wifi.STATE_CHANGE");
super.registerReceiver(yourReceiver, filters);
WIFI_STATE_CHANGED
<intent-action>
Wi-Fiが有効、無効、有効、無効、または不明であることを示すブロードキャスト。1つ余分に、この状態をintとして提供します。別のエクストラは、利用可能な場合、以前の状態を提供します。
STATE_CHANGE
<intent-action>
Wi-Fi接続の状態が変化したことを示すブロードキャスト。もう1つは、NetworkInfoオブジェクトの形式で新しい状態を提供します。新しい状態がCONNECTEDの場合、追加のエクストラがアクセスポイントのBSSIDとWifiInfoを提供する場合があります。文字列として
manifest
また、タグ内で適切な権限を指定する必要があります。
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
接続を確認するには、ConnectivityManager
使用可能な接続のタイプがわかるので使用できます。
ConnectivityManager conMngr = (ConnectivityManager)this.getSystemService(this.CONNECTIVITY_SERVICE);
android.net.NetworkInfo wifi = conMngr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
android.net.NetworkInfo mobile = conMngr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
これは、接続が変更されたときに通知を受け取るために私が行うことです。BroadCastReceiver
ブロードキャストを受信するためにを定義します。
public class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo wifi = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
NetworkInfo mobile = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
boolean isConnected = wifi != null && wifi.isConnectedOrConnecting() ||
mobile != null && mobile.isConnectedOrConnecting();
if (isConnected) {
Log.d("Network Available ", "YES");
} else {
Log.d("Network Available ", "NO");
}
}
}
BroadcastReceiver
また、マニフェストファイルでそれを定義し、でフィルタリングする必要がありますConnectivityChange
。
<receiver android:name=".NetworkChangeReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
ソースはこちら
@Dantalianの答えを補完するため。Android Nougat以降では、マニフェストでレシーバーを宣言しないでくださいCONNECTIVITY_ACTION
。ブロードキャストを受信しないためです。Context.registerReceiver(Receiver, Intent)
代わりに、メソッドを使用してレシーバーを登録する必要があります。
ここにソースへのリンク
BroadcastReceiver
接続ステータスが変更されたときにトリガーされるを作成する必要があります。
ブロードキャストレシーバーに渡すインテントフィルターを宣言します
IntentFilter filter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);
registerReceiver(mReceiver, filter);
ブロードキャストレシーバーで、EXTRA_WIFI_STATEを確認します。
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
switch (action)
{
case WifiManager.WIFI_STATE_CHANGED_ACTION:
int extra = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,0);
if(extra==WifiManager.WIFI_STATE_ENABLED)
{
}//...else WIFI_STATE_DISABLED, WIFI_STATE_DISABLING, WIFI_STATE_ENABLING
break;
}
}
};