首页 > 解决方案 > 来自 MainActivity 的 BroadcastReceiver 没有收到额外的

问题描述

考虑这个场景,涉及三个类:这是一个闹钟应用程序,您希望在闹钟服务开启时显示一个按钮,并在闹钟关闭时隐藏它。我想在 MainActivity 中的 BroadcastReceiver 从其他两个类接收一个额外的,以确定是否应该显示或隐藏按钮。

这是我在 MainActivity 中的 BroadcastReceiver,buttonVisibility 应该接收额外的。

BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (getIntent().getExtras() != null) {
                buttonVisibility = getIntent().getStringExtra("visibility");

                switch (buttonVisibility) {
                    case "visible":
                        showButtonMatikanAlarm();
                        break;
                    case "gone":
                        hideButtonMatikanAlarm();
                        break;
                    default:
                        //do nothing
                        break;
                }
            }
        }
};

onCreate我已经注册了广播接收器的方法上:

registerReceiver(broadcastReceiver, new IntentFilter("anim button"));

这是发送广播以显示按钮的代码片段,对于上下文,这是在接收器类和onRecieve方法内:

Intent intentShowButtonMatikan = new Intent("anim button");
intentShowButtonMatikan.putExtra("visibility", "visible");
context.sendBroadcast(intentShowButtonMatikan);

发送广播以隐藏按钮的代码,对于上下文,这驻留在对话框类中的方法中。当单击对话框的按钮时,它应该发送额外的:

Intent intentHideButtonMatikan = new Intent("anim button");
intentHideButtonMatikan.putExtra("visibility", "gone");
getContext().sendBroadcast(intentHideButtonMatikan);

当代码运行时,BroadcastReciever 被调用但永远不会得到额外的并buttonVisibility返回 null。怎么了?

任何帮助将不胜感激。我是 Android 的初学者,如果结果是一个菜鸟问题,我很抱歉。

标签: javaandroid

解决方案


在您的方法onReceive(Context context, Intent intent )内部是您传递的意图,您应该从中提取数据,

所以也许不是调用getIntent()直接从意图中提取数据,如下所示:

if (intent.getExtras() != null) {
   buttonVisibility = intent.getStringExtra("visibility"); }

因为通过调用getIntent()您将获得启动活动的 Intent 而不是接收者。

但是发送广播的正确方法是这样的

  • 在您的清单中注册接收者:

    <receiver android:name=".YourReceiver" android:enabled="true">
     <intent-filter>
            <action android:name="broad.cast.action.visibility" />
        </intent-filter>
    </receiver>
    
  • 或者直接如果它是您的 Activity 的孩子:

    registerReceiver(broadcastReceiver, new IntentFilter("broad.cast.action.visibility"));
    
  • 初始化您的意图:

    Intent yourIntent = new Intent("broad.cast.action.visibility");
    yourIntent.putExtra("visibility", "visible");
    sendBroadcast(yourIntent);
    
  • 获取数据:

    public void onReceive(Context context, Intent intent) {
    
      if(intent.getAction().equals("broad.cast.action.visibility")){
         buttonVisibility = intent.getStringExtra("visibility");
    
            switch (buttonVisibility) {
                case "visible":
                    showButtonMatikanAlarm();
                    break;
                case "gone":
                    hideButtonMatikanAlarm();
                    break;
                default:
                    //do nothing
                    break;
            }
     }
    }
    

请注意,视图可见性是一个 int,因此您可以直接将其作为 int 传递,而不是将可见性作为字符串传递。

intentShowButtonMatikan.putExtra("visibility", View.VISIBLE); //Or View.GONE;

在你的广播中,你不需要检查字符串,你可以使用直接设置可见性:

visibilty = intent.getIntExtra("visibility", View.GONE /* <-- Default value*/);
view.setVisibility(visibilty);

推荐阅读