Sending Intent from BroadcastReceiver class to currently running activity

17,044

Solution 1

You have three ways:
1) You can define your broadcast inside your MainActivity like this:
in onCreate()

registerReceiver(smsReceiver, new IntentFilter(SMS_RECIEVED));  

and define smsReciver in MainActivity

private BroadcastReceiver smsReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        //you can update textBox here
        handler.postDelayed(sendUpdatesToUI, 10);  
    }
};  

define a runnable to update UI

private Runnable sendUpdatesToUI = new Runnable() {
    public void run() {
        update();
    }
};

and update method

private void update(String text) {
    textView.setText(textView.getText().toString() + text);
} 

2) Register a receiver between your Activity and BroadCastReceiver

3) Start your Activity with new Intent to update current open Activity

Intent intent = new Intent(context, MainActivity.class);
intent.putExtra("Key", "text");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);  

UPDATE :
explain method 2
MainActivity.class

in onResume()

registerReceiver(broadcastReceiver, new IntentFilter(SmsReceiver.BROADCAST_ACTION));  

in onDestroy()

unregisterReceiver(broadcastReceiver);

local broadCast (broadcastReceiver, in MainActivity.class)

private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        updateUI(intent);
    }
};
private void updateUI(Intent intent) {
    String text = intent.getStringExtra("key");
    textView.setText(textView.getText().toString() + text);
}

SmsReceiver.class
global attribute

public static final String BROADCAST_ACTION = "your.package.name.displayevent";
private final Handler handler = new Handler();
Intent intent;
Context context;

in onReceive()

handler.removeCallbacks(sendUpdatesToUI);
handler.postDelayed(sendUpdatesToUI, 10);

this.context = context;//you can retrieve context from onReceive argument

this.intent = new Intent(BROADCAST_ACTION);

define two method

private Runnable sendUpdatesToUI = new Runnable() {
    public void run() {
        display();
    }
};

private void display() {
    intent.putExtra("key", text);
    context.sendBroadcast(intent);
}

Solution 2

Modify your code as below.

 public class SmsReceiver extends BroadcastReceiver {
@Override 

public void onReceive(Context context, Intent intent)
    { 
        Intent i = new Intent(context, MainActivity.class);
            i.putExtra("updatedString","Hello");            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_SINGLE_TOP);
            context.startActivity(i);
    } 
}

public class MainActivity extends Activity{

  private TextView results;
  @Override 
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Bundle extras = getIntent().getExtras();
        if(extras!=null){
            results = (TextView) findViewById(R.id.results);
            results.setVisibility(View.VISIBLE);
            results.append(extras.getString("updatedString"));
        } 

@Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
      //handle your intent here.Note this will be called even when activity first created.so becareful to handle intents correctly.
    }

}
Share:
17,044

Related videos on Youtube

user1692342
Author by

user1692342

Updated on June 08, 2022

Comments

  • user1692342
    user1692342 almost 2 years

    I have a class which extends BroadcastReceiver. On receiving a SMS, I would like to pass information to my main activity class to display the text in a box (Append, if already text is present).

    public class SmsReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent)
        {
            Intent i = new Intent(context, MainActivity.class);
                i.putExtra("updatedString","Hello");
                context.startActivity(i);
        }
    }
    

    MainActivity.java

    public class MainActivity extends Activity{
    
      private TextView results;
      @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            Bundle extras = getIntent().getExtras();
            if(extras!=null){
                results = (TextView) findViewById(R.id.results);
                results.setVisibility(View.VISIBLE);
                results.append(extras.getString("updatedString"));
            }
    
    }
    

    I have only one activity class (MainActivity.java). However When i do this I get an exception Unable to pause Activity.

  • user1692342
    user1692342 almost 9 years
    How do i Send the message from SmsReceiver Class. I have written the following code: Intent i = new Intent("SMS_RECIEVED"); i.putExtra("updatedString",str); LocalBroadcastManager mgr= LocalBroadcastManager.getInstance(context); mgr.sendBroadcast(i);
  • MHP
    MHP almost 9 years
    which way you want to use? 1 or 2 or 3?
  • MHP
    MHP almost 9 years
    you don't need to sendBroadCast ,receiver define in your MainActivity so you can simply edit textBox in your onReceive. I update answer to guid you
  • user1692342
    user1692342 almost 9 years
    I tried your 3rd method and it worked. However, everytime a message comes a new activity is being called. Is there a way I can avoid that?
  • MHP
    MHP almost 9 years
    try to add intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); to your intent
  • user1692342
    user1692342 almost 9 years
    where is the context defined in context.sendBroadcast ?
  • user1692342
    user1692342 almost 9 years
    the function display wont be able to access the variable context
  • user1692342
    user1692342 almost 9 years