Sending Intent from BroadcastReceiver class to currently running activity
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.
}
}
Related videos on Youtube
user1692342
Updated on June 08, 2022Comments
-
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 almost 9 yearsHow 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 almost 9 yearswhich way you want to use? 1 or 2 or 3?
-
MHP almost 9 yearsyou 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 almost 9 yearsI 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 almost 9 yearstry to add intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); to your intent
-
user1692342 almost 9 yearswhere is the context defined in context.sendBroadcast ?
-
user1692342 almost 9 yearsthe function display wont be able to access the variable context
-
user1692342 almost 9 yearsLet us continue this discussion in chat.