BroadcastReceiver declared in manifest is not rece

2019-02-06 08:45发布

I've tried to register a Wifi BroadcastReceiver to get the wifi state when it changes. But so far I have no luck receiving the broadcast.

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <receiver android:name=".WifiReceiver" >
        <intent-filter>
            <action android:name="android.net.wifi.WifiManager.WIFI_STATE_CHANGED_ACTION" />
            <action android:name="android.intent.action.PHONE_STATE" />
        </intent-filter>
    </receiver>

    //activity declaration here...

</application>

Do you guys know how to register the BraodcastReceiver in manifest?

I don't want to register it in activities because I want to monitor the wifi when there is changes in the wifi state whether my application is running or not.

This is my BroadcastReceiver class:

public class WifiReceiver extends BroadcastReceiver {
    private final String TAG = "WifiReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN);
        String wifiStateText = "No State";

        switch (wifiState) {
        case WifiManager.WIFI_STATE_DISABLING:
            wifiStateText = "WIFI_STATE_DISABLING";
            break;
        case WifiManager.WIFI_STATE_DISABLED:
            wifiStateText = "WIFI_STATE_DISABLED";
            break;
        case WifiManager.WIFI_STATE_ENABLING:
            wifiStateText = "WIFI_STATE_ENABLING";
            break;
        case WifiManager.WIFI_STATE_ENABLED:
            wifiStateText = "WIFI_STATE_ENABLED";
            break;
        case WifiManager.WIFI_STATE_UNKNOWN:
            wifiStateText = "WIFI_STATE_UNKNOWN";
            break;
        default:
            break;
        }
        MyLog.d(TAG, "onReceive Broadcast > WiFiState: " + wifiStateText);
        MyLog.d(TAG, "onReceive Broadcast > Time: " + new Date());
    }
}

I really hope to get some help. Thanks in advance.

6条回答
Ridiculous、
2楼-- · 2019-02-06 09:13

Your receiver in manifest should looks like this

<receiver android:name=".WifiReceiver" >
    <intent-filter>
       <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
    </intent-filter>
</receiver>

Also the following permission may be needed

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
查看更多
Lonely孤独者°
3楼-- · 2019-02-06 09:13
<receiver android:name=".WifiReceiver" >
     <intent-filter android:priority="100" >
          <action
             android:name="android.net.wifi.WIFI_STATE_CHANGED"
             android:enabled="true" />
     </intent-filter>
</receiver>

Enter the high priority and also enabled flag as true

查看更多
冷血范
4楼-- · 2019-02-06 09:20

This is all broadcast receiver related to the internet connection

<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />                
<action android:name="android.net.wifi.STATE_CHANGE" />
查看更多
劳资没心,怎么记你
5楼-- · 2019-02-06 09:21

The best that worked for me:

Manifest:

<receiver android:name="com.AEDesign.communication.WifiReceiver">
    <intent-filter android:priority="100">
        <action android:name="android.net.wifi.STATE_CHANGE" />
    </intent-filter>
</receiver>

WifiReceiver Class:

public class WifiReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
        if(info != null) {
            if(info.isConnected()) {
                //Do your work. 
                //To check the Network Name or other info:
                WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
                WifiInfo wifiInfo = wifiManager.getConnectionInfo();
                String ssid = wifiInfo.getSSID();    
            }
        }
    }
}

Permissions:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
查看更多
虎瘦雄心在
6楼-- · 2019-02-06 09:25

I think you have registered the receiver like this way:

<receiver
    android:name=".WiFiReciever">
    <intent-filter>
        <action
            android:name="class name with package" />
        <data
            android:scheme="myscheme" />
    </intent-filter>
</receiver> 
查看更多
太酷不给撩
7楼-- · 2019-02-06 09:31

Just because the broadcast was send with flag Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT, it means, your app must register this receiver before android boot up, which can only be the system services.

查看更多
登录 后发表回答