Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用广播接收器向布局中的对象发送命令?_Java_Android - Fatal编程技术网

Java 如何使用广播接收器向布局中的对象发送命令?

Java 如何使用广播接收器向布局中的对象发送命令?,java,android,Java,Android,我正在使用服务和广播接收器。当服务启动时,它将在用户的通知中心中放置一个通知,该通知返回一个START\u STICKY。我在通知中添加了一个操作按钮,该按钮将停止服务。这部分工作正常,但我的activity_main.xml布局上也有一个switch对象,如果用户仍打开该布局,我希望在用户点击该操作按钮停止服务时取消选中该对象,并在用户点击该操作按钮时聚焦在屏幕上 我认为这个解决方案就像使用平板电脑一样简单,但它对我不起作用 这是我试过的。。。我将以下代码放入广播接收器类的onReceive方

我正在使用服务和广播接收器。当服务启动时,它将在用户的通知中心中放置一个通知,该通知返回一个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);