我想开发一个android应用程序,它总是在收听可播放的广告,对信标有用。该应用程序具有活动和后台服务。所有BLE操作都在服务中完成,此服务在找到特定mac时执行REST post:
... mBluetoothAdapter.startLeScan(this);...
public void onLeScan(最终BluetoothDevice设备,最终int rssi,字节[]扫描记录)。。。
如果我运行应用程序并将智能手机分开,屏幕会关闭,但应用程序会继续工作,因为我可以在REST服务日志中看到有呼叫。然而,大约3小时后,android应用程序停止调用rest服务。
由于android服务是Sticky,a再次盯着应用程序并关闭应用程序。3秒钟后,服务启动,我看到Rest呼叫已完成。但是,15分钟后,服务停止调用Rest服务器。
所有逻辑都在onLeScan()回调中。所以我可以推断,即使周围有很多BLE设备在不断地做广告,这个回调也不会被调用。。。
拜托,有什么建议吗?
真是多谢了
据我所知,扫描过程没有时间限制。开发人员需要调用stopScan()来停止扫描过程。某些BLE设备需要scan()进程后台才能获取设备通知。我认为,你的信标属于这一类。我可以和你分享三个常见的建议
>
如果您需要继续扫描进程,最好在工作线程中执行扫描进程。
在Android 6以后的版本中,服务发生了巨大的变化。因此,不要使用服务,而是使用作业服务或WorkManager。
我的扫描实现如下(Kotlin版本)
/**
* 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/bl-in-android-kotlin-c485f0e83c16
首先,不要使用旧的扫描API。使用新推出的Lollipop。原因是您需要执行筛选扫描,以使其永远继续。过滤器需要根据广告数据包含的内容进行设置。
其次,使用前台服务确保应用程序进程不会在一段时间后终止。或者使用新的API设置匹配发生时执行的PendingEvent。
问题内容: 我正在使用Wget通过cron通过以下命令运行PHP脚本: 该脚本最多需要5-6分钟来进行处理。WGet是否会等待它并一直提供它所需的时间,还是会超时? 问题答案: 根据wget的手册页,有两个与超时有关的选项-默认读取超时为900s-所以我说是的,它可能会超时。 这是有问题的选项: 将网络超时设置为秒秒。这等效于同时指定, 和和 。 对于这三个选项: 将DNS查找超时设置为秒秒。 在
问题内容: 你如何提示用户进行一些输入,但在N秒后超时? Google指向上与此有关的邮件线程,但似乎无法正常工作。无论是还是,发生超时的语句总是可以得到: 不知何故,除了失败。 问题答案: 你链接到的示例是错误的,并且异常实际上是在调用警报处理程序而不是读取块时发生的。最好试试这个:
问题内容: 如果RPC没有超时机制,如果它试图调用已关闭服务器的RPC方法,该如何“杀死” RPC调用? 问题答案: 您可以使用渠道实施超时模式: 该会阻塞,直到返回或经过。
问题内容: 我正在利用的魔力。 但是,我想知道是否有人玩过超时设置? 我知道这基本上是决定请求的本地时间,但是如果达到超时时间,它可以触发任何内容吗?还是只是停止听别人的回应? 通过阅读jQuery网站,我可以看到没有传递任何参数,因此这似乎是一种具有一种功能的简单设置。没关系 但是,如果超时,我想触发警报或某些功能。在这种情况下,我可以看到错误设置没有被触发。 这是我的片段: 有谁知道如何超时工
您可以在下面的问题中看到:(liquibase-lock-reasons)当Liquibase操作中断时客户端Liquibase锁定,使Liquibase处于锁定状态。 我想知道是否有一种方法可以配置Liquibase,使其从列中的日期和时间自动检测这种情况。我想如果你已经拿着锁一个小时了--你应该把它叫做过期锁。
问题内容: 具体来说,问题是编写这样的方法: 如果数据在“超时”毫秒内可用,则返回值与in.read()相同,否则为-2。在方法返回之前,所有产生的线程必须退出。 为避免自变量,此处的主题为java.io.InputStream,如Sun(任何Java版本)所记录。请注意,这并不像看起来那么简单。以下是Sun的文档直接支持的一些事实。 in.read()方法可能是不可中断的。 将InputStre