将 Intent 显式寻址到动态注册的广播接收器

问题描述 投票:0回答:1

我是 Android 新手,正在尝试了解应用程序之间的通信。

我正在尝试编写 3 个可以相互通信的小应用程序。如果您想向每个人发送消息,只需使用隐式广播即可。

隐含意图

intent.setAction("com.example.myChatMessage")

如果您只想寻址 1 个特定接收者,我用

做到了

明确意图

intent.setComponent("com.example.test.android.broadcastreceiver.b", "com.example.test.android.broadcastreceiver.b.myBroadcastReceiver")

当广播接收器是一个单独的类并在

AndroidManifest.xml
中定义时,这才有效。

我的问题:是否可以显式寻址动态注册的广播接收器

包 com.example.test.android.broadcastreceiver.b;

公共类 MainActivity 扩展 Activity {

package com.example.test.android.broadcastreceiver.b;

public class MainActivity extends Activity {

    private final IntentFilter intentfilter = new IntentFilter("com.example.myChatMessage");
    private myBroadcastReceiver broadcastreceiver;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        broadcastreceiver = new myBroadcastReceiver();
        registerReceiver(broadcastreceiver, intentfilter);
    }

    public static class myBroadcastReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            String message = intent.getStringExtra("message");
            Log.d("message", "B received: " + message);
        }
    }
}

它接收所有隐式广播,但没有显式广播 - 我不知道如何解决它。你能帮我吗?

android broadcastreceiver
1个回答
21
投票

似乎不可能向动态注册的广播接收器发送显式意图。在 AndroidManifest.xml 中注册接收器是唯一的方法。

如果你动态注册一个BroadcastReceiver——通过调用Context.registerReceiver()——你提供了一个BroadcastReceiverinstance...如果你尝试通过命名BroadcastReceiver的类来向接收者发送一个Intent,它永远不会被传递。 Android系统不会将你声明的Intent匹配到你注册的BroadcastReceiver实例的类中。

来源:http://onemikro2nd.blogspot.com/2013/09/darker-corners-of-android.html

© www.soinside.com 2019 - 2024. All rights reserved.