我想开发一个始终收听ble广告的Android应用程序,对信标很有用。该应用程序具有活动和后台服务。所有BLE操作均在服务中完成,并且该服务在找到特定的mac时执行REST帖子:
... mBluetoothAdapter.startLeScan(this); ...
LeScan上的public void(最终的BluetoothDevice设备,最终的int rssi,byte [] scanRecord) ...
如果我运行应用程序并放开智能手机,则屏幕会关闭,但应用程序仍会继续工作,因为我在REST服务日志中可以看到有一个电话。但是,大约3小时后,Android应用程序停止调用其余服务。
由于android服务为Sticky,因此再次盯着该应用并关闭该应用。 3秒钟后,服务启动,我看到休息电话响了。但是,在15分钟后,该服务停止了调用剩余服务器。
所有逻辑都在onLeScan()回调内部。因此,我可以推断,即使有很多BLE设备不断进行广告宣传,该回调也会停止调用beeing。
请问对此有什么提示吗?
非常感谢
答案 0 :(得分:0)
首先,不要使用旧的扫描API。使用Lollipop中引入的新功能。这样做的原因是您需要执行过滤扫描以使其永远持续下去。需要根据广告数据包含的内容来设置过滤器。
第二,使用前台服务来确保您的应用程序进程不会在一段时间后被杀死。或者使用新的API,您可以在其中设置在发生匹配时执行的PendingIntent。
答案 1 :(得分:0)
据我了解,扫描过程没有时间表。开发人员需要调用stopScan()来停止扫描过程。某些BLE设备需要scan()进程背景来获取设备通知。我认为,您的信标属于该类别。我可以与您分享的三个常见建议
如果需要继续扫描过程,最好在辅助线程中进行扫描过程。
在Android 6及更高版本中,服务发生了翻天覆地的变化。因此,不要使用服务,而要使用Job Service或WorkManager。
下面给出了我的扫描实现(科林版)
/**
* Scan The BLE Device
* Check the available BLE devices in the Surrounding
* If the device is Already scanning then stop Scanning
* Else start Scanning and check 10 seconds
* Send the available devices as a callback to the system
* Finish Scanning after 10 Seconds
*/
fun scanBLEDevice(isContinuesScan: Boolean) {
try {
mIsContinuesScan = isContinuesScan
if (mScanThread != null) {
/**
* Already Running - No need to rescan
*/
return
}
mScanThread = Thread(mScanRunnable)
mScanThread.start()
/**
* Stop Scanning after a Period of Time
* Set a 10 Sec delay time and Stop Scanning
* collect all the available devices in the 10 Second
*/
if (!isContinuesScan) {
mHandler?.postDelayed({
// Set a delay time to Scanning
stopScan(mDeviceObject)
}, BLEConstants.SCAN_PERIOD) // Delay Period
}
} catch (e: Exception) {
Log.e(TAG, e.message)
}
}
private val mScanRunnable = Runnable {
if (mBluetoothAdapter != null && mBluetoothAdapter!!.isEnabled) {
scan()
}
}
private fun scan() {
if (isLollyPopOrAbove()) {// Start Scanning For Lollipop devices
mBluetoothAdapter?.bluetoothLeScanner?.startScan(/*scanFilters(),
scanSettings(),*/scanCallback) // Start BLE device Scanning in a separate thread
} else {
mBluetoothAdapter?.startLeScan(mLeScanCallback) // Start Scanning for Below Lollipop device
}
}
如果您需要更多信息,可以访问我的博客
https://medium.com/@nithinjith.p/ble-in-android-kotlin-c485f0e83c16
答案 2 :(得分:-2)
如果应用程序被杀死,或者用户甚至杀死了该应用程序,也不会打扰我!没问题,因为服务继续正常运行