如何将数据从BroadcastReceiver传递给Activity?

4
我有一个 BroadcastReceiver 类,它读取传入的 sms 并从中提取出一个 PIN。 我想把这个 sms 传递给一个已经对用户可见的活动。 用户应该在一个 EditText 中输入 PIN,我正在从 EditText 中获取值,将用户输入的 PIN 与由 BroadcastReceiver 传递的 PIN 进行比较。如果两者相匹配,则用户可以进入应用程序。但是我不知道如何将由 BroadcastReceiver 接收到的 PIN 传递到 Activity。 以下是代码:

BroadcastReceiver 类

public class IncomingMessage extends BroadcastReceiver {

final SmsManager sms = SmsManager.getDefault();
private OnSMSReceived onSMSReceived = null;

@Override
public void onReceive(Context context, Intent intent) {

    // Retrieves a map of extended data from the intent.
    final Bundle bundle = intent.getExtras();

    try {

        if (bundle != null) {

            String senderNum = null;
            String message = null;
            final Object[] pdusObj = (Object[]) bundle.get("pdus");

            for (int i = 0; i < pdusObj.length; i++) {

                SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
                String phoneNumber = currentMessage.getDisplayOriginatingAddress();

                senderNum = phoneNumber;
                message = currentMessage.getDisplayMessageBody();

                Log.i("SmsReceiver", "senderNum: " + senderNum + "; message: " + message);

            }

            if (senderNum.equals("ideamart")) {
                Log.d("MessageIdeaMart", message);

            } else if (senderNum.equals("FindDroid")) {
                if (message.startsWith("Welcome")) {
                    String[] splitArray = message.split(" ");
                    String pin = splitArray[7];
                    Log.d("PIN", pin);

                }
            }
        }
    } catch (Exception e) {
        Log.e("SmsReceiver", "Exception smsReceiver" + e);

    }
}


public void setOnSmsReceivedListener(Context context) {
    this.onSMSReceived = (OnSMSReceived) context;
}


public interface OnSMSReceived {
    void onSMSReceived(String pin);
}

}


嘿,只需在所需的活动中创建一个广播接收器类。分别在onResume和onPause中注册和注销它。现在当您发送广播时,请使用与您在活动内创建广播时相同的操作。 - Rahul Sharma
4个回答

3

您可以在Activity中创建动态BroadcastReceiver:

BroadcastReceiver receiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
    Toast.makeText(context, "Received Broadcast", Toast.LENGTH_SHORT).show();
  }
};

@Override
protected void onResume() {
  super.onResume();
  // Register the receiver
  String action = "com.SOME_BROADCAST";
  registerReceiver(mReceiver, new IntentFilter(action));
}

@Override
protected void onPause() {
  super.onPause();
  // Unregister the receiver to save unnecessary system overhead
  // Paused activities cannot receive broadcasts anyway
  unregisterReceiver(mReceiver);
}

2

您需要创建广播接收器并在活动中注册它。 通过onReceive方法,您可以执行UI更改。 如果有意图,则可以从中获取数据或捆绑包。

BroadcastReceiver receiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
    TextView tv=(TextView)findViewById(R.id.tv);
    tv.setText("Hello");
  }
};

@Override
protected void onResume() {
  super.onResume();
  registerReceiver(receiver, new IntentFilter("my.custom.action"));
}

@Override
protected void onPause() {
  super.onPause();
  unregisterReceiver(receiver);
}

2

IncomingMessage中的变量onSMSReceived设为静态变量。

setOnSmsReceivedListener方法设为静态方法,并将其签名更改为:

public static void setOnSmsReceivedListener(OnSMSReceived onSMSReceived) {
onSMSReceived = onSMSReceived;
}

您的界面:(更改了方法名称以避免混淆)

public interface OnSMSReceived {
void smsReceived(String pin);
}

当你的senderNum匹配时,执行以下操作(在获取验证码之后)

onSMSReceived.smsReceived(pin);

在您的活动中执行以下操作:

IncomingMessage.setOnSmsReceivedListener(new OnSMSReceived(){
        @Override
        public void messageReceived(String pin) {
          // get the pin from EditText which is entered by user
          // match it with the one you are getting here
        }
})

如果广播接收器作为单独的类编写,则在清单中注册接收器。 - Prathamesh Toradmal

0

你的BroadcastReceiver类中已经定义了一个监听器。那个监听器的目的是什么?

你可以通过使用监听器将数据传递给Activity。

  • 利用监听器,在接收到短信时通知监听器。
  • 将BroadcastReceiver作为Activity的内部类。
  • 我认为,你也可以使用Intents将数据传递给Activity。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接