繁体   English   中英

MainActivity的BroadcastReceiver没有额外收到

[英]BroadcastReceiver from MainActivity does not receive extra

考虑这种情况,涉及三个类:这是一个警报应用程序,您希望在警报服务打开时显示一个按钮,并在警报关闭时隐藏它。 我希望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"));

这是发送广播到show按钮的代码片段,对于上下文,这是在接收器类和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的首发,对不起,如果它是一个noob问题。

你的方法内部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> 
  • 或直接,如果它是您的活动的孩子:

     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,因此您可以将其作为字符串直接传递,而不是将可见性作为字符串传递。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM