-1

I have 2 broadcastReceivers are registered from onResume when the toggle button is clicked. And in onPause i unregister them, but when I press the home button the App crashes an logcat generates the below errors.

Code_Updated_2:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    SetUpAllViews(R.layout.activity_main);

}

private void setViewState(int view, boolean state) {
    // TODO Auto-generated method stub
    switch(view) {
    case R.id.togbtn_connect: tog_connect.setEnabled(state);
    case R.id.et_ip: et_ip.setEnabled(state);
    case R.id.btn_send: btn_send.setEnabled(state);
    case R.id.et_msg: et_msg.setEnabled(state);
    }
}

private BroadcastReceiver mNetworkReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub

        mConnMgr = (ConnectivityManager)getSystemService(network_service);
        networkInfo = mConnMgr.getActiveNetworkInfo();
        if (networkInfo != null) {
            if (networkInfo.isConnected()) {
                setText(R.id.tv_conn_status, ""+networkInfo);
                registerReceiver(mWiFiReceiver,
                        new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION));

                setViewState(R.id.et_ip, true);
                setViewState(R.id.btn_send, false);
                setViewState(R.id.et_msg, false);

            }else if (networkInfo.isConnectedOrConnecting()) {
                setText(R.id.tv_conn_status, "Status: CONNECTED Or CONNECTING");
            }else if (networkInfo.isFailover()){
                setText(R.id.tv_conn_status, "Status: FailOver");
            }else if (networkInfo.isRoaming()) {
                setText(R.id.tv_conn_status, "Status: Roaming");
            }else if (networkInfo.isAvailable()) {
                setText(R.id.tv_conn_status, "Status: Available");
            }
        }else {
            setText(R.id.tv_conn_status, "Status: No Default NetWork Connected");
        }
    }
};

private BroadcastReceiver mWiFiReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub

        mWiFi_Mgr = (WifiManager) getSystemService(wifi_service);
        if (mWiFi_Mgr != null)
            mWiFi_Info = mWiFi_Mgr.getConnectionInfo();

        int wifiExtras = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN);

        switch(wifiExtras) {
        case WifiManager.WIFI_STATE_ENABLING: setText(R.id.tv_wifi_state, "Enabling..."); break;
        case WifiManager.WIFI_STATE_ENABLED: 
            setText(R.id.tv_wifi_state, "Enabled");
            if (mWiFi_Info != null) {
                if (mWiFi_Info.getBSSID() != null) {
                    setText(R.id.tv_conn_bssid, "BSSID: "+mWiFi_Info.getBSSID());
                    }else {
                        setText(R.id.tv_conn_bssid, "BSSID: "+mWiFi_Info.getBSSID());
                        }
                setText(R.id.tv_conn_speed, "Speed: "+mWiFi_Info.getLinkSpeed()+WifiInfo.LINK_SPEED_UNITS);
                setText(R.id.tv_conn_strength, "RSSI: "+WifiManager.calculateSignalLevel(mWiFi_Info.getRssi(), 5));
                setText(R.id.tv_conn_ip, getIPv4(mWiFi_Info.getIpAddress()));
            }
            break;
        case WifiManager.WIFI_STATE_DISABLING: setText(R.id.tv_wifi_state, "Disabling..."); break;
        case WifiManager.WIFI_STATE_DISABLED: setText(R.id.tv_wifi_state, "Disabled");  break;
        case WifiManager.WIFI_STATE_UNKNOWN: setText(R.id.tv_wifi_state, "Unkown_WiFi_State"); break;
        }
    }
};

private void SetUpAllViews(int layout) {
    // TODO Auto-generated method stub
    setContentView(layout);

    tv_conn_status = (TextView) findViewById(R.id.tv_conn_status);
    tv_wifi_state = (TextView) findViewById(R.id.tv_wifi_state);
    tv_conn_bssid = (TextView) findViewById(R.id.tv_conn_bssid);
    tv_conn_speed = (TextView) findViewById(R.id.tv_conn_speed);
    tv_conn_strengt = (TextView) findViewById(R.id.tv_conn_strength);
    tv_conn_ip = (TextView) findViewById(R.id.tv_conn_ip);
    et_ip = (EditText) findViewById(R.id.et_ip);
    tog_connect = (ToggleButton) findViewById(R.id.togbtn_connect);
    et_msg = (EditText) findViewById(R.id.et_msg);
    btn_send = (Button) findViewById(R.id.btn_send);
}

private void setText(int view, String text) {
    // TODO Auto-generated method stub
    switch(view) {
    case R.id.tv_conn_status: tv_conn_status.setText(text); break;
    case R.id.tv_wifi_state: tv_wifi_state.setText(text); break;
    case R.id.tv_conn_bssid: tv_conn_bssid.setText(text); break;
    case R.id.tv_conn_speed: tv_conn_speed.setText(text); break;
    case R.id.tv_conn_strength: tv_conn_strengt.setText(text); break;
    case R.id.tv_conn_ip: tv_conn_ip.setText(text); break;
    }
}

private String getIPv4(int ip) {
    // TODO Auto-generated method stub
    String result = String.format("%d.%d.%d.%d", (ip & 0xff), (ip >> 8 & 0xff), (ip >> 16 & 0xff),
            (ip >> 24 & 0xff));

    return result;
}

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    tog_connect.setOnCheckedChangeListener(new OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            // TODO Auto-generated method stub
            if (isChecked) {
                registerReceiver(mNetworkReceiver, 
                    new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
            }else {
                if (mWiFi_Mgr.getWifiState() == WifiManager.WIFI_STATE_ENABLED)
                    mWiFi_Mgr.setWifiEnabled(false);
                if (mWiFiReceiver != null)
                    unregisterReceiver(mWiFiReceiver);
                if (mNetworkReceiver != null)
                    unregisterReceiver(mNetworkReceiver);
            }
        }
    });
}

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    //if (mWiFiReceiver != null)
        //unregisterReceiver(mWiFiReceiver);
    if (mNetworkReceiver != null) 
        unregisterReceiver(mNetworkReceiver);
}

}

LogCat:

11-08 17:18:00.025: E/AndroidRuntime(5541): FATAL EXCEPTION: main
11-08 17:18:00.025: E/AndroidRuntime(5541): Process: com.example.wifi_socket_01, PID:  
5541
11-08 17:18:00.025: E/AndroidRuntime(5541): java.lang.RuntimeException: Unable to pause 
activity {com.example.wifi_socket_01/com.example.wifi_socket_01.wifi_socket_01}: 
java.lang.IllegalArgumentException: Receiver not registered:  
com.example.wifi_socket_01.wifi_socket_01$1@43033000
11-08 17:18:00.025: E/AndroidRuntime(5541): Caused by:  
java.lang.IllegalArgumentException: Receiver not registered: com.
example.wifi_socket_01.wifi_socket_01$1@43033000
11-08 17:18:00.025: E/AndroidRuntime(5541):     at  
android.app.LoadedApk.forgetReceiverDispatcher(LoadedApk.java:671)
11-08 17:18:00.025: E/AndroidRuntime(5541):     at 
android.app.ContextImpl.unregisterReceiver(ContextImpl.java:1785)
11-08 17:18:00.025: E/AndroidRuntime(5541):     at   
com.example.wifi_socket_01.wifi_socket_01.onPause(wifi_socket_01.java:184)
Amrmsmb
  • 1
  • 27
  • 104
  • 226

3 Answers3

1

onResume() you are registering only one receiver. But mWiFiReceiver registered from another receiver. When onPause executed it will unregistered mNetworkReceiver naturally. But unregisterReceiver(mWiFiReceiver); gives you error because it is not registered there.

  • now, i tried to only to unregister mNetWorkReceiver from onPause, and removed the code of unregistering mWiFiReceiver from onPause, and when i run the app it crahsed also – Amrmsmb Nov 08 '14 at 20:29
  • It doesn't matter commenting unregisterReceiver(mWiFiReceiver); because you are registering that receiver but still not unregistering. I am sure if you stop registering mWiFiReceiver receiver your code will work smooth. –  Nov 09 '14 at 04:00
1

Or you can include include in your onPause() method a try {...} catch(IllegalArgumentException e) {...} structure.

Will be something like this:

if (mWiFi_Mgr.getWifiState() == WifiManager.WIFI_STATE_ENABLED)
      mWiFi_Mgr.setWifiEnabled(false);
      if (mWiFiReceiver != null)
           try {
               unregisterReceiver(mWiFiReceiver);
           }  catch(IllegalArgumentException e) {
               //your catching code.
           } catch (Exception e) {
               //just in case other exception appears
           }
           ....

You will be able to capture unexpectect problems.

Trebia Project.
  • 930
  • 2
  • 17
  • 36
1

As exception says You are attempting to unregister the receiver which is not registered

In you onResume() only one receiver is being registered, but in onPause() two receiver are being unregistered. An attempt to unregister the not-registered receiver (wifi receiver) is leading to raise an exception.

Gaurav Gupta
  • 4,586
  • 4
  • 39
  • 72