MainActivity的BroadcastReceiver不会收到额外的

时间:2019-05-25 02:18:05

标签: java android

考虑这种情况,涉及三个类别:这是一个警报应用程序,您想在警报服务打开时显示一个按钮,而在警报关闭时隐藏它。我想让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方法上,我已经注册了broadcastReceiver:

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的初学者,如果遇到一个菜鸟问题,则表示抱歉。

1 个答案:

答案 0 :(得分:0)

在方法 onReceive(Context context, Intent intent

是您传递的意图,您应该从中提取数据,

所以也许不像这样调用 getIntent()那样直接从intent中提取数据:

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);