Call an activity method from a BroadcastReceiver class
Solution 1:
Create the BroadcastReceiver dynamically:
In your BroadcastReceiver class define class member:
YourMainActivity yourMain = null;
and method:
setMainActivityHandler(YourMainActivity main){
yourMain = main;
}
from your MainActivity do:
private YourBroadcastReceiverClassName yourBR = null;
yourBR = new YourBroadcastReceiverClassName();
yourBR.setMainActivityHandler(this);
IntentFilter callInterceptorIntentFilter = new IntentFilter("android.intent.action.ANY_ACTION");
registerReceiver(yourBR, callInterceptorIntentFilter);
finally, when yourBR.onReceive is fired you can call:
yourMain.methodOfMainActivity();
Solution 2:
#Make your BroadcastReceiver independent of Activity
Making a BroadcastReceiver
inner class of an Activity
so that it can access UI elements from its onReceive()
method just does not make sense. If you do so you can not reuse the BroadcastReceiver
with any other activity. And you will end up writing almost same code again and again.
A better way of doing this would be, make a Callback for BroadcastReceiver
and let Your Activity subscribe this Callback.
How do I do that?
1) Create a CallBack interface
public interface ReceiverCallback{
public void doSomething(Object object);
}
2) Provide your Callback in the BroadcastReceiver
public class MyBroadcastReceiver extends BroadcastReceiver {
private ReceiverCallback callback;
public MyBroadcastReceiver(ReceiverCallback callback){
this.callback = callback; //<--Initialize this
}
@Override
public void onReceive(Context context, Intent intent) {
// Your listening logic goes here (New WIFI Scan data available,
Headphone plugged in etc)
// Send any data or No data(null)
callback.doSomething(null); //<--Send callback event
}
}
3) Subscribe Your Activity for CallBack events:
public YourActivity extends AppCompatActivity implements ReceiverCallback{
// Your Activity code
public void updateUI() { //<-- You want this to get Triggered
// Update UI code
}
@Override
public void doSomething(Object object){
updateUI(); //<-- Callback does that
}
}
##Relevant Link: Read a more detailed discussion HERE