Search code examples
androidandroid-intentbroadcastreceiveractivity-lifecycleintentfilter

Some Issues about Using BroadcastReceivers


I want to use BroadcastReceiver in my application as AsyncTask result indicator in different Activities and therefore AsyncTasks too. I think my approach is little wrong or I missed something.

Here what I'm doing: Firstly, during onCreate I registered my receiver as a BroadcastReceiver using the registerReceiver method. My receiver looks like:

protected BroadcastReceiver myReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String msg_for_me = intent.getStringExtra("some_msg");
        Log.i("Tutorial", msg_for_me);
    }
}

In my application, I've A and B activities. Each have different receivers which getting messages from different tasks. By the way, I must clarify that, A activity starting B activity.

I'm using receiver which in activity A, then activity A starting B using the startActivity. In activity B, I'm executing an AsyncTask and on onPostExecute I'm sending a broadcast with B activity's context. But somehow still A activity's receiver getting message. Both receivers have the same content but have different names.

So here are my issues:

  • Should I unregisterReceiver when I started new activity on onPause method?
  • Is BroadcastReceiver that how I'm using, only for one call? Should I register again and again whenever I send any message?
  • I'm pretty sure I didn't define any receiver to Manifest. I suppose this is what I'm doing wrong. If this is well, how can I use IntentFilter while sending broadcast?

Please let me know if there is uncertain question. Any clues about BroadcastReceiver would be great and appriciated.


Solution

    1. Yes, you should unregister broadcast receiver on activity pause. It is the potential leak.
    2. No broadcast receivers are not for one call. They are called everytime the broadcast is done for the registered intents.
    3. You can register the receiver for particular intent on OnResume like this,

    mContext.registerReceiver(iReceiver, new android.content.IntentFilter("android.intent.action.BATTERY_CHANGED"));

    Where iReceiver is ,

     iReceiver = new IntentReceiver();
    
    private class IntentReceiver extends BroadcastReceiver {
        private final String LOG_TAG="IntentReceiver";
    
        @Override
        public void onReceive(Context arg0, Intent intent) {
    
        }
     }
    

    and unregister the same on OnPause

    mContext.unregisterReceiver(iReceiver);