newbie
newbie

Reputation: 958

Broadcast to 2 running activities within an application

I have 2 activities running. Activity A is started first followed by Activity B. (ie A in stack, B in focus). I have BroadcastReceiver running on both activities. The problem is only Activity A is able to capture my broadcast messages (using sendBroadcast)

Why is this so? How can I enable both activities to receive the broadcast without terminating (calling finish on Activity A)

Also, is there any way I can reuse the Broadcast receiver method in Activity A?

Broadcast Activity

Intent intent = new Intent(MESSAGE_UPDATE);
intent.putExtra("message", message);
sendBroadcast(intent);

Activity A

@Override
public void onResume() {
    super.onResume();
    if(resumeHasRun==false){
    IntentFilter movementFilter;
    movementFilter = new IntentFilter();

    movementFilter.addAction(NewService.MESSAGE_UPDATE);

    registerReceiver(mIntentReceiver, movementFilter);
    resumeHasRun=true;
    return;
    }
}
public BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String message = intent.getStringExtra("message");
                    updateTable(message);


    }
};

@Override
protected void onDestroy() {
    super.onDestroy();
  unregisterReceiver(mIntentReceiver);
}

public void startNewActivity(){
    Intent newIntent = new Intent(getApplicationContext(),ActivityB.class);
    startActivity(newIntent);
    //never call finish
}

Activity B

@Override
public void onResume() {
    super.onResume();
    if(resumeHasRun==false){
    IntentFilter movementFilter;
    movementFilter = new IntentFilter();

    movementFilter.addAction(NewService.MESSAGE_UPDATE);

    registerReceiver(mIntentReceiver, movementFilter);
    resumeHasRun=true;
    return;
    }
}
public BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String message = intent.getStringExtra("message");
                    updateAnotherTable(message);


    }
};
@Override
protected void onDestroy() {
    super.onDestroy();
  unregisterReceiver(mIntentReceiver);
}

Upvotes: 2

Views: 2504

Answers (2)

FunkTheMonk
FunkTheMonk

Reputation: 10938

Move:

registerReceiver(mIntentReceiver, movementFilter); to onStart()
unregisterReceiver(mIntentReceiver); to onStop()

Make (in its own file):

public class TableUpdateReceiver extends BroadcastReceiver {
    public interface Listener {
       public void tableUpdate(String message);
    };
    Listener mListener;

    public TableUpdateReceiver(Listener list) {
         mListener = list;
    }
    @Override
    public void onReceive(Context context, Intent intent) {
        String message = intent.getStringExtra("message");
        if(mListener != null) {
            mListener.tableUpdate(message);  
        } 
    }
};

Make your activities implement TableUpdateReceiver.Listener and:

public BroadcastReceiver mIntentReceiver;
onCreate(Bundle savedState) {
   ...
   mIntentReceiver = new TableUpdateReceiver(this);
   ...
}

public void tableUpdate(String message) {
   //do something
}

Upvotes: 2

ud_an
ud_an

Reputation: 4921

see this example it will help you in your problem. Register in both activity and make abstract class activity.

Upvotes: 1

Related Questions