【问题标题】:How to pass data from BroadcastReceiver to an Activity? [duplicate]如何将数据从 BroadcastReceiver 传递到 Activity? [复制]
【发布时间】:2016-09-15 12:46:17
【问题描述】:

我有一个BroadcastReceiver 类,它读取传入的sms 并从sms 中提取一个pin。 我想将 sms 传递给用户已经可见的活动。 用户应在EditText 中输入引脚,我从EditText 中获取值,将用户输入的引脚与BroadcastReceiver 传递的引脚进行比较。如果两者相互匹配,用户可以进入应用程序。但我不知道如何将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 中注册和取消注册。现在,当您当时发送广播时,使用与创建内部活动时对广播相同的操作。

标签: android android-activity broadcastreceiver


【解决方案1】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 如果将接收器写成单独的类,则在清单中注册接收器
      【解决方案4】:

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

      你可以将数据实际传递给 Activity 的方式

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

      【讨论】:

        猜你喜欢
        • 2012-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多