34

電話がWiFiに接続されるたびにデータベースを更新するアプリがあります。を実装しましたがServiceBroadcastReceiverこれは実行されます(使用中のネットワークがわかります)が、問題は、ネットワークの状態が変化したとき、または何らかの接続が行われたときに、ファイルにService何を追加して開始するかがわからないことです。ネットワークのmanifestBroadcastReceiver

4

5 に答える 5

64

あなたが必要です

<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);
于 2012-05-24T07:40:39.237 に答える
5

これは、接続が変更されたときに通知を受け取るために私が行うことです。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>

ソースはこちら

于 2015-07-21T11:53:30.040 に答える
2

@Dantalianの答えを補完するため。Android Nougat以降では、マニフェストでレシーバーを宣言しないでくださいCONNECTIVITY_ACTION。ブロードキャストを受信しないためです。Context.registerReceiver(Receiver, Intent)代わりに、メソッドを使用してレシーバーを登録する必要があります。

ここにソースへのリンク

于 2017-09-21T16:16:24.060 に答える
1

BroadcastReceiver接続ステータスが変更されたときにトリガーされるを作成する必要があります。

ここで同じ質問アプリケーション全体でインターネット接続を定期的にチェックする方法は?

于 2012-05-24T07:53:34.980 に答える
1

ブロードキャストレシーバーに渡すインテントフィルターを宣言します

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;
        }

    }
};
于 2018-07-30T14:04:43.633 に答える