40

I am trying to use a BroadcastReceiver as an inner class to track the network state but I got the exception in the title. What should I do to fix this problem?

public class NetworkChangeReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        final ConnectivityManager connMgr = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);

        final android.net.NetworkInfo wifi = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        final android.net.NetworkInfo mobile = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

        if (wifi.isAvailable() || mobile.isAvailable()) {
            setupData();
            Log.d("Netowk Available ", "Flag No 1");
        }
    }
}
MHSaffari
  • 858
  • 1
  • 16
  • 39
Karim Abdell Salam
  • 706
  • 1
  • 6
  • 15

4 Answers4

108

Your

inner Broadcast receiver must be static ( to be registered through Manifest)

OR

Non-static broadcast receiver must be registered and unregistered inside the Parent class

for this.

I was using an Inner broadcast reciver, without registering it within the class. Either make it static and register in Manifest , or Make it non static and register and unregister inside the parent class .

Ajji
  • 3,068
  • 2
  • 30
  • 31
  • 3
    Had the same problem with an Activity implemented as an inner class. Same solution – declaring the inner class as static fixed it. – user149408 Jul 06 '16 at 19:00
16

A non-static inner class cannot be registered via the AndroidManifest.xml. You can either:

Register it dynamically as outlined in this thread, and remove the empty constructor.

Or,

Make your inner class static, and register it in the AndroidManifext.xml.

Mehmet K
  • 2,805
  • 1
  • 23
  • 35
  • when i remove the empty constructor the same exception is happening – Karim Abdell Salam Apr 29 '15 at 15:01
  • 2
    Aha, turns out that is the problem. An (non-static) inner class cannot be instantiated by Android via the AndroidManifest.xml (Android developer documentation on BroadcastReceiver). Check [this thread](http://stackoverflow.com/questions/3608955/receiver-as-inner-class-in-android) out, and dynamically register your receiver. – Mehmet K Apr 29 '15 at 15:11
  • @KarimAbdellSalam I've edited my answer too, so make sure you accept my answer if it answers your question :) – Mehmet K May 01 '15 at 15:27
1

just make your Receiver Class static like:

public [static] class ReceiverClass extends BroadcastReceiver

Hadi
  • 544
  • 1
  • 8
  • 28
-2

e~~I just meet that problem,and I refactor the class NetworkChangeReceiver to an another place