Java 如何使用广播接收器向布局中的对象发送命令?
我正在使用服务和广播接收器。当服务启动时,它将在用户的通知中心中放置一个通知,该通知返回一个START\u STICKY。我在通知中添加了一个操作按钮,该按钮将停止服务。这部分工作正常,但我的activity_main.xml布局上也有一个switch对象,如果用户仍打开该布局,我希望在用户点击该操作按钮停止服务时取消选中该对象,并在用户点击该操作按钮时聚焦在屏幕上 我认为这个解决方案就像使用平板电脑一样简单,但它对我不起作用 这是我试过的。。。我将以下代码放入广播接收器类的onReceive方法中。除此之外,我在该方法中拥有的所有其他东西都可以正常工作Java 如何使用广播接收器向布局中的对象发送命令?,java,android,Java,Android,我正在使用服务和广播接收器。当服务启动时,它将在用户的通知中心中放置一个通知,该通知返回一个START\u STICKY。我在通知中添加了一个操作按钮,该按钮将停止服务。这部分工作正常,但我的activity_main.xml布局上也有一个switch对象,如果用户仍打开该布局,我希望在用户点击该操作按钮停止服务时取消选中该对象,并在用户点击该操作按钮时聚焦在屏幕上 我认为这个解决方案就像使用平板电脑一样简单,但它对我不起作用 这是我试过的。。。我将以下代码放入广播接收器类的onReceive方
LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
View v = inflater.inflate(R.layout.activity_main, null);
Switch sw = (Switch) v.findViewById(R.id.mySwitch);
sw.setChecked(false);
你会认为那会管用的。我告诉它查看一个特定的布局,然后我告诉它从通知中的action按钮对该布局上存在的switch对象执行一个uncheck命令。它没有收到命令
有什么想法吗?谢谢你的帮助
[在此处输入图像描述]
()
如果它有帮助,我的项目可以在这里下载。。。
这是我的新变化
广播接收机类
public static String ACTION_TURN_OFF_THE_LIGHTS = "com.mathiasapps.lightsonexample.action.TURN_OFF_THE_LIGHTS";
Intent actionStopIntent = new Intent(this, actionTurnOffReceiver.class);
actionStopIntent.setAction(ACTION_TURN_OFF_THE_LIGHTS);
PendingIntent actionStopPI = PendingIntent.getBroadcast(this, 0, actionStopIntent, PendingIntent.FLAG_UPDATE_CURRENT);
主要活动类
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
IntentFilter filter = new IntentFilter(ACTION_TURN_OFF_THE_LIGHTS);
registerReceiver(receiver, filter);
这是我试过的。。。我将以下代码放入广播接收器类的onReceive方法中。除此之外,我在该方法中拥有的所有其他东西都可以正常工作
LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
View v = inflater.inflate(R.layout.activity_main, null);
Switch sw = (Switch) v.findViewById(R.id.mySwitch);
sw.setChecked(false);
LayoutFlater充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
视图v=充气机。充气(R.layout.activity_main,空);
开关sw=(开关)v.findViewById(R.id.mySwitch);
sw.setChecked(假)
你会认为那会管用的
不,你不会的
我告诉它查看一个特定的布局,然后我告诉它从通知中的action按钮对该布局上存在的switch对象执行一个uncheck命令
不,你不是
你的问题
您正在膨胀主活动布局的全新实例,在该布局中找到开关,并将该开关(不是活动中的开关)设置为未选中。这样做并没有触及实际的活动布局
解决方案
您需要向活动注册广播接收器,以便活动的实际运行实例可以接收广播并切换其包含的开关。有关示例,请参见
伪代码(不用说,这是未经测试的,旨在指导您实现解决方案):
在问题后编辑: 1-设置操作时,您的目标是服务的本地接收器,目的是:
// Will only invoke `actionTurnOffReceiver` declared in the service.
Intent actionStopIntent = new Intent(this, actionTurnOffReceiver.class);
你需要一个任何接收者(即活动中的接收者)都能听到的更一般的意图
// ACTION_TURN_OFF_THE_LIGHTS is some string like "com.my.package.action.TURN_OFF_THE_LIGHTS"
Intent actionStopIntent = new Intent(this, ACTION_TURN_OFF_THE_LIGHTS)
2-您的活动注册过于通用:
// This is blindly registering for all broadcasts - or Android will just ignore it
IntentFilter filter = new IntentFilter();
registerReceiver(receiver, filter);
正如我链接到的文档中的示例所示,您必须设置过滤器以匹配您关心的意图。在这种情况下,它用于“关闭”操作:
请复习,以便更好地了解它们的工作原理。这将进入广播接收器。可能在活动主界面中,将接收器放入并取消选中。我想这不会让它已经运行了,如果不能这样做,那就太酷了。我只是想让我的项目尽可能的对用户友好。用户不会看到你的代码。在使用该xml的活动中放置另一个接收者,并将veiw放在var中,然后将其关闭,我认为这应该是可行的。另一个活动可以激发意图(如果它已启动)。所以,我在问题中提到的onReceive应该发送命令,而你提到的onReceive将在MainActivity类中接收该命令,该命令应该关闭该开关?是的,我想是的。谢谢,但这对我也不起作用。我认为这是不可能的。使用我描述的模式肯定是可能的。“那没用”并没有告诉我你到底做了什么,你的代码是什么样子的。更新您的问题或询问一个新问题,清楚地说明您正在尝试什么以及正在发生什么。我在这个问题上添加了我的项目的下载链接。我更新了我的答案。
// This is blindly registering for all broadcasts - or Android will just ignore it
IntentFilter filter = new IntentFilter();
registerReceiver(receiver, filter);
IntentFilter filter = new IntentFilter(ACTION_TURN_OFF_THE_LIGHTS);
registerReceiver(receiver, filter);