Метод активности вызова от широковещательного приемника

В основном действии загружается макет, который имеет несколько полей ввода и кнопку отправки. Когда нажата кнопка отправки, метод обработчика onClick отправляет sms обратно на тот же номер мобильного телефона:

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

Существует широковещательный приемник, который перехватывает сообщение:

 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(); } } } 

Теперь, из широковещательного приемника, я хочу вызвать функцию (с параметром), которая находится в моей основной деятельности. Это возможно? Если да, какой код я должен добавить в свой приемник вещания?

Solutions Collecting From Web of "Метод активности вызова от широковещательного приемника"

Спасибо @ Manishika. Чтобы уточнить, сделать динамику Broadcastreceiver, а не определять ее в манифесте, сделал трюк. Поэтому в моем классе приемника вещания я добавляю код:

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

В конце функции onReceive класса BroadcastReceiver я вызываю функцию основного действия:

 main.verifyPhoneNumber("hi"); 

В основном действии я динамически определяю и регистрирую широковещательный приемник перед отправкой 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); 

использовать это

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

Перейдите в контекст своей деятельности к контенту BroadcastReceiver.

 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 } } 

И в вашем 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); } } 

Надеюсь, поможет

Вы не можете напрямую вызывать функцию в своей деятельности, если она не является общедоступным статическим методом, но не делает этого. Я рекомендую это:

 @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); } 

А затем из вашей onCreate() получите Bundle и примите свои действия по мере необходимости.