Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android wifi或3g网络状态更改时广播接收器_Android_Android Service - Fatal编程技术网

Android wifi或3g网络状态更改时广播接收器

Android wifi或3g网络状态更改时广播接收器,android,android-service,Android,Android Service,我有一个应用程序,可以在手机连接到WiFi时更新数据库。我已经实现了一个服务和广播接收器,它将运行服务(它将告诉我正在使用什么网络),但问题是,我不知道在网络状态更改或连接到您需要的某种网络时,在清单文件中添加什么来启动广播接收器 <intent-filter> <action android:name="android.net.wifi.WIFI_STATE_CHANGED"/> <action android:name="android.net.wifi.STA

我有一个应用程序,可以在手机连接到WiFi时更新数据库。我已经实现了一个
服务
广播接收器
,它将运行
服务
(它将告诉我正在使用什么网络),但问题是,我不知道在网络状态更改或连接到您需要的某种网络时,在
清单
文件中添加什么来启动
广播接收器

<intent-filter>
<action android:name="android.net.wifi.WIFI_STATE_CHANGED"/>
<action android:name="android.net.wifi.STATE_CHANGE"/>
</intent-filter>
WIFI\u状态已更改

广播
,指示Wi-Fi已启用、禁用、启用、禁用或未知。一个额外值以int形式提供此状态。另一个额外值提供前一个状态(如果可用)

状态变化

广播
,表示Wi-Fi连接状态已更改。另外一个以NetworkInfo对象的形式提供新状态。如果新状态已连接,则额外的附加功能可能会提供接入点的BSSID和WifiInfo。一串

此外,您还需要在
manifest
标记中指定正确的权限:

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

您应该制作一个
BroadcastReceiver
,当连接状态更改时将触发该接收器:


这里有同样的问题

这是我在连接发生变化时得到通知的方法。 您可以定义一个
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开始,您不应该在清单上声明您的接收器,因为它不会接收
连接\u操作
广播。您应该改为使用
Context.registerReceiver(receiver,Intent)
方法注册接收者


指向源的链接

声明要传递给广播接收器的意图筛选器

IntentFilter filter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);
registerReceiver(mReceiver, filter);
在广播接收器中,检查额外的无线状态

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

    }
};

我们还可以添加一个广播接收器来检查数据连接吗?我想这只会让我们改变WIFI适配器的连接。我想在移动数据连接发生更改时收到通知。谢谢iccthedral。作为传递给筛选器的字符串文字的替代,WiFiMaNaGeN.WiFiStayeOxEdEdActhActudio和WiFimaNigaR.NETWorksStisteOxTyxEdAcAcess是WifiManager.class.Please中的等效定义,考虑从Android N开始<代码>“
广播已弃用。文档建议使用
JobScheduler
GCMNetworkManager
@Nicholas,这不是不推荐的。您只需在代码中创建广播接收器,而不是在清单文件中。
IntentFilter filter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);
registerReceiver(mReceiver, filter);
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;
        }

    }
};