将数据从“BroadcastReceiver”发送到“Activity”

Sending data from `BraodcastReceiver` to `Activity`

我有一个 MainActivity 和一个 MyBroadcastReceiver。 BroadcastReceiver 等待传入的短信并读取短信和 senderId,它应该实时将此数据发送到 MainActivity。我试图在 Activity 本身中实现 ​​BroadcastReceiver,但它再次启动 activity。

    Public class MainActivity extends AppCompatActivity{
 public static String BROADCAST_ACTION = "SMSCOMING";
    private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            final Bundle bundle = intent.getExtras();
            try {
                //Getting the data d
                    triggerFunc(d);
                    }
                }
            } catch (Exception e) {
                Log.e(TAG, "Exception: " + e.getMessage());
            }
        }
    };

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
     IntentFilter filter = new IntentFilter();
        filter.addAction(BROADCAST_ACTION);
        this.registerReceiver(this.broadcastReceiver, filter);
}

void triggerFunc(data d){
   //Do some stuff
}

    }

BroadcastReceiver收到短信通知时,无法知道Activity是不是运行。如果你想启动 Activity,你需要创建一个合适的 Intent 并调用 Context.startActivity().

您应该创建一个扩展 BroadcastReceiver 的 class 而不是简单地创建一个匿名内部 class 的实例。此外,您应该使用 AndroidManifest.xml 中的 <receiver> 标签注册您的 BroadcastReceiver

根据您的 Receiver 仅在 Activity 为 运行 时才调用的问题添加的任何代码。而不是单独创建广播(从 activity 中删除并在您的包中创建新的 class)并在 AndroidManifest 文件中注册并从 Receiver 调用您的 activity。

如下图。

在您的包中创建 BroadcastReceiver Class。

public class BinarySMSReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            final Bundle bundle = intent.getExtras();
            try {
                //Getting the data d
                    Intent intent = new Intent();
                    intent.setClassName(context, "activity.class");
                    intent.putExtras(bundle);
                    context.startActivity(intent);


            } catch (Exception e) {
                Log.e(TAG, "Exception: " + e.getMessage());
            }
        }
    };

在 AndroidManifest

<receiver android:name="com.company.application.SMSBroadcastReceiver" >
        <intent-filter android:priority="500">
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>

请注意我们在Android中有两种广播接收器:

  • 独立广播接收器(四个主要 Android 构建块之一)。这种类型的接收器必须在 Android 清单文件中注册。无论应用的 UI 是 运行ning 与否,只要收到它们的匹配意图,这些接收者就会 运行。

  • In-Activity 广播接收器。此类接收器不需要在 Manifest 文件中注册,您应该在 运行 时注册它们。这些接收器仅在其封闭 activity 处于活动状态且 运行ning.

  • 时才为 运行

因此,如果您希望您的应用能够捕获所有 SMS 消息,而不管其 UI 状态如何,您将需要前一个选项。但是,如果您需要您的应用程序在显示 activity 时捕获 SMS 消息,则需要后一个选项。