Android BroadcastReceiver onReceive Update TextView in MainActivity
Solution 1
In your MainActivity
initialize a variable of MainActivity
class like below.
public class MainActivity extends Activity {
private static MainActivity ins;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ins = this;
}
public static MainActivity getInstace(){
return ins;
}
public void updateTheTextView(final String t) {
MainActivity.this.runOnUiThread(new Runnable() {
public void run() {
TextView textV1 = (TextView) findViewById(R.id.textV1);
textV1.setText(t);
}
});
}
}
public class NotifAlarm extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
try {
MainActivity .getInstace().updateTheTextView("String");
} catch (Exception e) {
}
}
}
Solution 2
#Use Interface Another way to deal with this situation is by using an Interface. I will describe the advantage of this approach but first, let's see how it's done.
Follow these steps:
1) Create an interface
public interface MyBroadcastListener{
public void doSomething(String result);
}
2) Initialize the listener in BroadCastReceiver
public class NotifAlarm extends BroadcastReceiver {
private MyBroadcastListener listener;
@Override
public void onReceive(Context context, Intent intent) {
listener = (MyBroadcastListener)context;
// other things done here like notification
// NUPDATE TEXTV1 IN MAINACTIVITY HERE
listener.doSomething("Some Result");
}
}
3) Implement the interface in Activity and override the method
public YourActivity extends AppCompatActivity implements MyBroadcastListener{
// Your Activity code
public void updateTheTextView(String t) {
TextView textV1 = (TextView) findViewById(R.id.textV1);
textV1.setText(t);
}
@Override
public void doSomething(String result){
updateTheTextView(result); // Calling method from Interface
}
}
##Advantages of using the interface?
- When you have BroadcastReceiver in a different file
- Decoupled BroadcastReceiver
Using an interface makes BroadcastReceiver independent of any Activity. Let's say in future you want to use this BroadCastReceiver with another Activity which takes the result from BroadcastReceiver and start a DetailActivity. This is completely a different task but you will use the same BroadcastReceiver without even a single code change inside BroadcastReceiver.
How to do that?
Implement the interface in the Activity and Override the method. That's it!
public ListActivity extends AppCompatActivity implements MyBroadcastListener{
// Your Activity code
public void startDetailActivity(String title) {
Intent i = new Intent(ListActivity,this, DetailActivity.class);
i.putExtra("Title", title);
startActivity(i);
}
@Override
public void doSomething(String result){
startDetailActivity(String title); // Calling method from Interface
}
}
Solution 3
create an instance of the class and then pass the value to the function that changes TextView value follow these steps please : in your BroadcastReceiver overRide onReceive method and paste These lines or changes theme as you wish
private Handler handler = new Handler(); // Handler used to execute code on the UI thread
// Post the UI updating code to our Handler
handler.post(new Runnable() {
@Override
public void run() {
//Toast.makeText(context, "Toast from broadcast receiver", Toast.LENGTH_SHORT).show();
YourActivityToUpdate.updateTheTextView(message);
YourActivityToUpdateinst = YourActivityToUpdate.instance();
if(inst != null) { // your activity can be seen, and you can update it's context
inst.updateTheTextView(message);
}
}
});
now we explain the updateTheTextView and inst in YourActivityToUpdate class Paste these Lines please
private static SignUpVerify mInst;
public static SignUpVerify instance() {
return mInst;
}
@Override
public void onStart() {
super.onStart();
mInst = this;
}
@Override
public void onStop() {
super.onStop();
mInst = null;
}
and this is the updateTheTextView method that should be placed in YourActivityToUpdate class
public void updateTheTextView(final String verifyCodeValue) {
Log.i("verifyCodeValue", verifyCodeValue);
YourTextViewToUpdate.setText(verifyCodeValue);
}
i think this is a better way thanks to "kevin-lynx"
Solution 4
If someone is searching this exact solution, but in Kotlin, do the following:
class MainActivity : AppCompatActivity() {
companion object {
var ins: MainActivity? = null
fun getInstance(): MainActivity? {
return ins
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
ins = this
}
fun updateTheTextView(t: String) {
[email protected] {
val textV1 = findViewById<TextView>(R.id.textV1)
textV1.text = t
}
}
}
class NotifAlarm : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
try {
MainActivity.getInstance()?.updateTheTextView("The String")
} catch (e: Exception) {
}
}
}
user3499199
Updated on August 12, 2022Comments
-
user3499199 almost 2 years
In MainActivity I have a TextView: textV1. I also have a method in MainActivity that updates that textview:
public void updateTheTextView(final String t) { MainActivity.this.runOnUiThread(new Runnable() { public void run() { TextView textV1 = (TextView) findViewById(R.id.textV1); textV1.setText(t); } }); }
In a BroadcasrReceiver I need to update the text in textV1 in MainActivity.
public class NotifAlarm extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // other things done here like notification // NEED TO UPDATE TEXTV1 IN MAINACTIVITY HERE } }
How can this be done? The BroadcastReceiver is run from a service. This code I cannot change. Can I access and change textV1 in MainActivity from onReceive()? I've tried many things but all fail.
-
InnocentKiller about 10 yearsJust take one static string and then store this textview's result in it and access it in this class.
-
user3499199 about 10 yearsThanks for the reply InnocentKiller. Sorry, I'm not sure what you mean. Can you please explain? I appreciate the help.
-
InnocentKiller about 10 yearsDeclare one static string variable inside your MainActivity and then store the value of your textview inside that string and then you can use that string anywhere in any class.
-
InnocentKiller about 10 yearsI think you can do this, but i am not sure but just give a try.
-
user3499199 about 10 yearsThanks, I could use a static string however, that wont change the text within the textview in mainactivity. I need to be able to change the text form onreceive().
-
Faisal Ali about 10 yearsYou can use Handler class, It is more natural way to update UI from non UI Thread. stackoverflow.com/questions/14643385/…
-
-
user3499199 about 10 yearsgetInstace() does not work in broadcastreceiver: MainActivity .getInstace().updateTheTextView("String"); Doesnt know getinstance
-
User10001 about 10 yearsjust in MainActivity create this method and i also updated the answer.
-
user3499199 about 10 yearsYou, InnocentKiller and ashish, are awesome! Works perfect. Thank you a lot.
-
User10001 about 10 yearsmark the answer solve so that it helps the other to find the answer.
-
user3499199 about 10 yearsThank you both. Will mark solved. Only one problem. Error generated when MainActivity is now running. Works perfect when class is running but errors when not running. Also when MainActivity is running getinstance recreates mainactivity so now 2 are running.
-
User10001 about 10 yearsgetinstance method does not creates the Instance of MainActivity it only give the reference of current instance of the MainActivity.
-
Manoj Behera almost 9 yearsWorked for me. Thanks!
-
Dayan over 8 yearsLove this! Thank you.
-
vladimir over 7 years@User10001 But if I have
ins = null
in public static ReceiverActivitygetInstance() { Log.d("RECEIVER_ACTIVITY", "getInstance => "+String.valueOf(ins)); return ins; }
what i should do with it? -
Selvin over 7 years
private static MainActivity ins;
terrible idea which causing activity leaks -
Brian M over 3 yearsNot working in the updateTheTextView function: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference- This is the issue that I keep facing.