Java Android-在服务内部注册的广播接收器不工作

Java Android-在服务内部注册的广播接收器不工作,java,android,service,bluetooth,broadcastreceiver,Java,Android,Service,Bluetooth,Broadcastreceiver,我正在开发一个Android应用程序,它使用蓝牙连接到远程设备(特别是HC-05蓝牙模块)。目前,我正努力在服务类中正确注册一些广播接收器 我想要实现的是: 在main活动中有一个带有onClickListener的按钮,它启动连接服务 在实例化服务的onStartCommand方法中,我注册先前创建的接收器(作为服务类中的字段) 当找到蓝牙设备时,我想执行一些代码。该代码应包含在接收器的onReceive方法中,该方法设置为侦听Bluetooth设备。找到操作。 [我知道,这并不是什么复杂的事

我正在开发一个Android应用程序,它使用蓝牙连接到远程设备(特别是HC-05蓝牙模块)。目前,我正努力在
服务
类中正确注册一些
广播接收器

我想要实现的是:

  • main活动中
    有一个带有
    onClickListener
    按钮
    ,它启动
    连接服务
  • 在实例化服务的
    onStartCommand
    方法中,我注册先前创建的接收器(作为服务类中的字段)
  • 当找到蓝牙设备时,我想执行一些代码。该代码应包含在接收器的
    onReceive
    方法中,该方法设置为侦听
    Bluetooth设备。找到操作
    。 [我知道,这并不是什么复杂的事情…]
  • 但是: 当我注册接收器并开始发现时,似乎接收器不工作。我的意思是,他们不接受行动

    我的代码如下所示:

    在主要活动中:

    connectButton.setOnClickListener(新视图.OnClickListener(){
    @凌驾
    公共void onClick(视图v){
    Log.d(Constants.TAG,“点击连接按钮。启动连接服务”);
    Intent startConnectionServiceIntent=新的Intent(MainActivity.this,ConnectionService.class);
    Context=getApplicationContext();
    startService(startConnectionServiceIntent);
    
    在连接服务中:

    公共类连接服务扩展服务{
    私人蓝牙适配器BA;
    私有连接启动线程连接启动程序;
    私有连接线程连接线程;
    私有连接线程连接线程;
    私人蓝牙插座;
    专用布尔设备基金;
    private final BroadcastReceiver actionFoundReceiver=new BroadcastReceiver(){
    @凌驾
    公共void onReceive(上下文、意图){
    //TODO自动生成的方法存根
    String action=intent.getAction();
    if(BluetoothDevice.ACTION_FOUND.equals(ACTION)){
    [...]
    deviceFound=true;
    BA.cancelDiscovery();
    [...]
    }
    否则{
    deviceFound=false;
    }
    }
    }
    };
    private final BroadcastReceiver discoveryStartedReceiver=新的BroadcastReceiver(){
    @凌驾
    公共void onReceive(上下文、意图){
    String action=intent.getAction();
    if(BluetoothAdapter.ACTION\u DISCOVERY\u STARTED.equals(ACTION)){
    //做点什么
    }
    }
    };
    private final BroadcastReceiver discoveryFinishedReceiver=new BroadcastReceiver(){
    @凌驾
    公共void onReceive(上下文、意图){
    String action=intent.getAction();
    if(BluetoothAdapter.ACTION\u DISCOVERY\u FINISHED.equals(ACTION)){
    //做点别的
    }
    }
    };
    @凌驾
    公共int onStartCommand(Intent Intent、int标志、int startId){
    BA=BluetoothAdapter.getDefaultAdapter();
    registerReceiver(actionFoundReceiver,新的IntentFilter(BluetoothDevice.ACTION_-FOUND));
    registerReceiver(discoveryStartedReceiver,新的IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_STARTED));
    registerReceiver(discoveryFinishedReceiver,新的IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED));
    Log.d(Constants.TAG,“ConnectionService已启动”);
    BA.startDiscovery();
    connectionStarter=新的ConnectionStarterThread();
    connectionStarter.run();
    返回super.onStartCommand(intent、flags、startId);
    }
    
    问题是:我做错了什么?

    要指定此代码,请执行以下操作:

    connectionStarter=newconnectionstarterthread();
    connectionStarter.run();
    
    负责创建一个
    线程
    ,该线程可重复检查
    DeviceFund
    变量是否已设置为
    true
    (应由
    actionFoundReceiver
    处理),如果是,则启动蓝牙连接(这是按照Android开发者示例中的建议完成的)。问题可能就在这里

    我已经尝试过的:

  • 用谷歌搜索这个话题——人们通常建议用与上面相同的方法来做
  • 我在清单文件中有蓝牙权限
  • 作为
    BroadcastReceiver
    类的子类注册的
    BroadcastReceiver
    没有帮助

  • 有人能帮我解决这个问题吗?有没有更简单的方法呢?

    +1这是一个写得很好、研究得很好的问题。欢迎这么做。看了这篇文章,我想知道你为什么要将BT发现应用到服务中。
    startDiscovery()
    已经是异步的,所以这并不是必须的。您确认所有的代码——特别是注册——都被执行了吗?您认为connectionStarter.run()应该做什么?它应该启动一个
    while(true)
    循环,在该循环中每两秒钟执行一次:
    if(deviceFound==true){
    并执行一些代码(如果是)。我确认该程序没有进入任何接收器的
    onReceive()
    方法。请参阅线程文档,了解如何启动()线程确保我会这样做,但为什么程序没有进入
    onReceive()
    s?