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