java - 来自 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 的初学者,如果结果是一个菜鸟问题,我很抱歉。
解决方案
在您的方法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);
推荐阅读
- google-cloud-platform - 数据存储模拟器返回“事务内只允许祖先查询”。它不支持 Datastore 模式下的 Firestore 吗?
- elasticsearch - 在 Elasticsearch 数据中添加 Threat Intel 字段
- spring-cloud-gateway - 一组 url 不刷新 Spring 会话超时
- java - WRITE_SETTINGS 权限 Android
- google-sheets - 如何查找两个日期时间值之间的经过时间
- c++ - 在模板化函数上使用 std::function
- sql - 从 SQL Server 中的 JSON 字符串中提取 GUID
- python - 在 PyCharm 中进入我的代码时变量值的颜色变化
- sql - 我如何在配置单元中为这个用例创建一个宏?
- ios - 接收 UICollectionView 装饰视图的触摸