如何发送和接收广播信息

61

我试图在两个活动之间传递数据,这两个活动都在选项卡中。我正在尝试使用sendBroadcast()。然而,在设置断点后,我从未到达onReceive()

清单:

<activity
    android:name=".WebResults"
    android:label="@string/app_name">

    <intent-filter>
        <action android:name="com.toxy.LOAD_URL" />
    </intent-filter>         
</activity>

活动发送方:

Intent intent=new Intent(getApplicationContext(),WebResults.class);
intent.setAction("com.toxy.LOAD_URL");
intent.putExtra("url",uri.toString());
sendBroadcast(intent);

活动接收器:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);    
    IntentFilter filter = new IntentFilter("com.toxy.LOAD_URL");
    this.registerReceiver(new Receiver(), filter);
}

private class Receiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context arg0, Intent arg1) {
        String url = arg1.getExtras().getString("url");
        WebView webview =(WebView)findViewById(R.id.webView);
        webview.loadUrl(url);
    }
}

将所有内容放在一个活动中,而不是为选项卡使用单独的活动,这样您就不再需要尝试使用广播在它们之间进行通信。 - CommonsWare
我该如何取消注册这个接收器? - AlexS
你应该更改问题标题,它对那些搜索“如何发送和接收广播消息”并通过谷歌获得了第一结果的人们没有帮助,回答你的所有人都建议使用除发送广播之外的另一种方法。 - Alireza Jamali
4个回答

43

我遇到了与你相同的问题,但是我找到了解决方法:

从清单文件中删除意图过滤器并更改

Intent intent=new Intent(getApplicationContext(),WebResults.class);

对于

Intent intent=new Intent();

希望能帮助到您!

8
请使用

标签。

intent.getStringExtra("");

并且。
new Intent();

对我有用。


2
你可以这样做:

你可以像这样做

Intent intent = new Intent("msg");    //action: "msg"
intent.setPackage(getPackageName());
intent.putExtra("message", message.getBody());
getApplicationContext().sendBroadcast(intent);

然后,要接收写入的内容,可以在 Activity 中编写以下代码:
@Override
protected void onResume() {
    super.onResume();
    mBroadcastReceiver = new BroadcastReceiver(){

        @Override
        public void onReceive(Context context, Intent intent){
           /* Toast.makeText(context, "Message is: "+ intent.getStringExtra("message"), Toast.LENGTH_LONG)
                    .show();*/
            String action = intent.getAction();
            switch (action){
                case "msg":
                    String mess = intent.getStringExtra("message");
                    txt.setText(mess);
                    break;
            }
        }

    };

    IntentFilter filter = new IntentFilter("msg");
    registerReceiver(mBroadcastReceiver,filter);
}

@Override
protected void onPause() {
    super.onPause();
    unregisterReceiver(mBroadcastReceiver);
}

0
发送者活动:
你好,根据发送者的活动,你只需要指定动作和额外数据,以便根据某些条件启动隐式广播意图。
隐式广播的示例;
Intent intent = new Intent();

intent.setAction("com.example.broadcast.MY_NOTIFICATION");

intent.putExtra("data_key", "hello all");

sendBroadcast(intent);

你还可以使用adb:
adb shell am broadcast -a com.example.broadcast.MY_NOTIFICATION --es data_key "hello all"

接收器活动

现在在接收器的活动中,您可以在onCreate()或onResume()方法中正常注册您的广播。

然后,在onPause()或onDestroy()回调中取消注册,或者如果销毁活动,这就是为什么您的监听范围仅限于接收器活动的生命周期。

注意:从API26+开始,只有当前正在运行的活动(后台或前台)才能检测到这种类型的广播。如果您的目标是Android 8.0(API26),则无法在应用程序的Manifest.xml中声明它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接