如何更好地将数据从 BroadcastReceiver 发送到 Activity?

How better send data from BroadcastReceiver to Activity?

我想在我的应用程序中捕捉短信并在我的视图中显示。我创建 BroadcastReceiver:

public class SMSMonitor extends BroadcastReceiver {
    private static final String ACTION = "android.provider.Telephony.SMS_RECEIVED";

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent != null && intent.getAction() != null && ACTION.compareToIgnoreCase(intent.getAction()) == 0) {
            Object[] pduArray = (Object[]) intent.getExtras().get("pdus");
            SmsMessage[] messages = new SmsMessage[pduArray.length];
            for (int i = 0; i < pduArray.length; i++) {
                messages[i] = SmsMessage.createFromPdu((byte[]) pduArray[i]);
            }
            StringBuilder bodyText = new StringBuilder();
            for (SmsMessage message : messages) {
                bodyText.append(message.getMessageBody());
            }
            String body = bodyText.toString();
            Toast.makeText(context, body, Toast.LENGTH_LONG).show();
            abortBroadcast();
        }
    }
}

它显示 Toast wuth 短信正文。现在我不知道该怎么办

  1. 创建服务并将短信传递给服务。并从服务中获取短信
  2. 使用 Otto 观察器并从以下位置发送数据(短信): 1.广播接收器 2.服务 赶上我的 activity.
  3. 另一种更正确的方式

如果我将使用 Otto(我想要它)在哪里更好地发送数据 - 从 BroadcastReceiver 或将数据传递到服务并从服务发送 otto 消息?

Otto 或 EventBus 对我来说是最简单的解决方案,也是最能反映您的 Activity 生命周期的解决方案。

一个好的开始是 register/unregister 你从 onPause()onResume 乘坐公共汽车,像这样:

@Override
public void onResume() {
    super.onResume();

    BusProvider.getInstance().register(this);
}

@Override
public void onPause() {
    super.onPause();

    BusProvider.getInstance().unregister(this);
}

接下来,post 来自您 BroadcastReceiver 的活动,例如 BusProvider.getInstance().post(new SmsEvent());

您的片段或Activity 将通过@Subscribe 方法和方法的SmsEvent 参数类型接收事件。

看来你不需要任何服务,除非你想在 activity 未打开时保存数据。