Android 如何将数据从广播接收器传递到活动?

Android 如何将数据从广播接收器传递到活动?,android,android-activity,broadcastreceiver,Android,Android Activity,Broadcastreceiver,我有一个BroadcastReceiver类,它读取传入的sms,并从sms中提取pin码。 我想将该sms传递给用户已经可见的活动。 用户应在EditText中输入pin,我从中的EditText中获取值,将用户输入的pin与广播接收器传递的pin进行比较。如果两者都匹配,用户可以进入应用程序。但我不知道如何将广播接收器接收到的Pin码传递到活动。 这是密码 广播接收机类 public class IncomingMessage extends BroadcastReceiver { fin

我有一个
BroadcastReceiver
类,它读取传入的
sms
,并从
sms
中提取pin码。 我想将该
sms
传递给用户已经可见的活动。 用户应在
EditText
中输入pin,我从中的
EditText
中获取值,将用户输入的pin与
广播接收器传递的pin进行比较。如果两者都匹配,用户可以进入应用程序。但我不知道如何将
广播接收器
接收到的Pin码传递到
活动
。 这是密码

广播接收机类

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);
}
公共类IncomingMessage扩展了BroadcastReceiver{
final smsmsmanager sms=smsmsmanager.getDefault();
私有onsmserved onsmserved=null;
@凌驾
公共void onReceive(上下文、意图){
//从意图检索扩展数据的映射。
final Bundle=intent.getExtras();
试一试{
if(bundle!=null){
字符串senderNum=null;
字符串消息=null;
最终对象[]pdusObj=(对象[])bundle.get(“pdus”);
对于(int i=0;i

}

您可以在活动中创建动态广播接收器:

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

您已经在BroadcastReceiver类中定义了一个侦听器。那个听众的目的是什么

实际将数据传递给活动的方式

  • 利用监听器,当你收到短信时通知监听器
  • 将BroadcastReceiver作为活动的内部类
  • 我认为,您还可以使用意图将数据传递给活动
您必须制作一个广播接收器并在活动中注册它。 通过其onReceive方法,您可以执行UI更改。 或者,如果存在数据或捆绑包,您也可以从intent获取数据或捆绑包

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

IncomingMessage

将您的
设置msreceivedListener
方法设置为静态,并将其签名更改为:

public static void setOnSmsReceivedListener(OnSMSReceived onSMSReceived) {
onSMSReceived = onSMSReceived;
}
您的接口:(更改方法名称以避免混淆)

然后,当您的
senderNum
匹配时,执行此操作(在您获得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
        }
})

嘿,只需在所需的活动中创建一个广播接收器类。分别在onResume和onPause中注册和注销它。现在,当您在那个时候发送广播时,请使用和您在创建内部活动时对广播所做的相同的操作。若它是作为单独的类编写的,请在清单中注册接收方
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
        }
})