call activity method from broadcast receiver

匿名 (未验证) 提交于 2019-12-03 01:57:01

问题:

In the main activity, a layout is loaded that has some input fields and a submit button. When the submit button is clicked, the onClick handler method sends an sms back to the same mobile number :

SmsManager sms = SmsManager.getDefault(); sms.sendTextMessage(number, null, "hi", null, null); 

There is a broadcast receiver defined that intercepts the message :

public class SmsReceiver extends BroadcastReceiver {  @Override public void onReceive(Context context, Intent intent) {     Bundle pdusBundle = intent.getExtras();     Object[] pdus=(Object[])pdusBundle.get("pdus");     SmsMessage messages=SmsMessage.createFromPdu((byte[]) pdus[0]);     if(messages.getMessageBody().contains("hi")){         abortBroadcast();     }  } } 

Now, from the broadcast receiver, I want to call a function(with parameter), which is within my main activity. Is that possible? If yes, what kind of code should i add in my broadcast receiver ?

回答1:

Thanks @Manishika. To elaborate, making the Broadcastreceiver dynamic, instead of defining it in the manifest, did the trick. So in my broadcast receiver class, i add the code :

MainActivity main = null; void setMainActivityHandler(MainActivity main){     this.main=main; } 

In the end of the onReceive function of the BroadcastReceiver class, I call the main activity's function :

main.verifyPhoneNumber("hi"); 

In the main activity, I dynamically define and register the broadcast receiver before sending the sms :

SmsReceiver BR_smsreceiver = null;             BR_smsreceiver = new SmsReceiver();             BR_smsreceiver.setMainActivityHandler(this);             IntentFilter fltr_smsreceived = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");             registerReceiver(BR_smsreceiver,fltr_smsreceived);   


回答2:

Pass your Activity's context to BroadcastReceiver's contructor.

public class SmsReceiver extends BroadcastReceiver{      MainActivity ma; //a reference to activity's context      public SmsReceiver(MainActivity maContext){         ma=maContext;     }      @Override     public void onReceive(Context context, Intent intent) {         ma.brCallback("your string"); //calling activity method     }  } 

and in your MainActivity

public class MainActivity extends AppCompatActivity {     ...     public void onStart(){         ...             SmsReceiver smsReceiver = new SmsReceiver(this); //passing context     LocalBroadcastManager.getInstance(this).registerReceiver(smsReceiver,null);         ...     }      public void brCallback(String param){         Log.d("BroadcastReceiver",param);     } } 

hope it helps



回答3:

use this

Intent intent=new Intent(); intent.setClassName("com.package.my", "bcd.class"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  context.startActivity(intent); 


回答4:

You can't directly call a function in your Activity unless it's a public static method but don't do so. I recommend this:

@Override public void onReceive(Context context, Intent intent) {     Bundle bundle = new Bundle();     bundle.putExtraString("ACTION", "stopBroadcast");      // ### put what ever you need into the bundle here ###      Intent intent = new Intent();     intent.setClassName(context, "activity.class");     intent.putExtras(bundle);      context.startActivity(intent); } 

And then from your Activity's onCreate() get Bundle and take your actions as needed.



回答5:

It's a little bit late, but nobody mentioned it. There is no need for passing activity. As @faizal specifies, IntentService is started from MainActivity, so, context in onReceive() is already instance of MainActivity. It is enough to write smth like this:

@Override public void onReceive(Context context, Intent intent) {     if(context instanceof MainActivity) {         MainActivity activity = (MainActivity) context;     } } 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!