Метод активности вызова от широковещательного приемника
В основном действии загружается макет, который имеет несколько полей ввода и кнопку отправки. Когда нажата кнопка отправки, метод обработчика 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();
}
}
}
Теперь, из широковещательного приемника, я хочу вызвать функцию (с параметром), которая входит в мою основную деятельность. Это возможно? Если да, какой код я должен добавить в свой приемник вещания?
Ответы
Ответ 1
Спасибо @Manishika. Чтобы разработать динамический Broadcastreceiver, а не определять его в манифесте, сделали свое дело. Итак, в моем классе приемника вещания, я добавляю код:
MainActivity main = null;
void setMainActivityHandler(MainActivity main){
this.main=main;
}
В конце функции onReceive класса BroadcastReceiver я вызываю основную функцию активности:
main.verifyPhoneNumber("hi");
В основном задании я динамически определяю и регистрирую широковещательный приемник перед отправкой смс:
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
Передать контекст своей деятельности в конструктор BroadcastReceiver.
public class SmsReceiver extends BroadcastReceiver{
MainActivity ma; //a reference to activity 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);
}
}
надеюсь, что это поможет
Ответ 3
используйте этот
Intent intent=new Intent();
intent.setClassName("com.package.my", "bcd.class");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
Ответ 4
Вы не можете напрямую вызывать функцию в своей деятельности, если она не является общедоступным статическим методом, но не делает этого. Я рекомендую это:
@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);
}
И затем из вашего Activity onCreate()
получите Bundle и примите свои действия по мере необходимости.
Ответ 5
Было немного поздно, но никто не упомянул об этом. Нет необходимости в прохождении активности. Как указывает @faizal, IntentService запускается из MainActivity, поэтому context
в onReceive()
уже является экземпляром MainActivity. Достаточно написать что-то вроде этого:
@Override
public void onReceive(Context context, Intent intent) {
if(context instanceof MainActivity) {
MainActivity activity = (MainActivity) context;
}
}