Android altbeacon在后台运行时间隔不等

Android altbeacon在后台运行时间隔不等,第1张

概述我正在开发一个运行后台服务以间隔设置蓝牙信标的应用程序.我使用计时器启动ForegroundService,以每分钟10秒的间隔(范围为200毫秒)启动信标,并计算最强的信标并将其提交给后端API.只要应用程序处于前台状态,并且在屏幕关闭时,只要我使用adb logcat进行连接,它就可以正常工作.一旦我将其取下,就不再有任何内容提交到服务器,这意味着不再有

我正在开发一个运行后台服务以间隔设置蓝牙信标的应用程序.

我使用计时器启动ForegroundService,以每分钟10秒的间隔(范围为200毫秒)启动信标,并计算最强的信标并将其提交给后端API.

只要应用程序处于前台状态,并且在屏幕关闭时,只要我使用adb logcat进行连接,它就可以正常工作.一旦我将其取下,就不再有任何内容提交到服务器,这意味着不再有任何信标被调整.

以下是相关的代码段,希望我不要简化太多:

class BeaconService : Service(),BeaconConsumer {    private var beaconManager: BeaconManager? = null    private var rangingTimer = Timer("rangingTimer",true)    private val region = Region("com.beacon.test",IDentifIEr.parse("f7826da6-4fa2-4e98-8024-bc5b71e0893e"),null,null)    overrIDe fun onStartCommand(intent: Intent?,flags: Int,startID: Int): Int {        return Service.START_STICKY    }    overrIDe fun onCreate() {        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {            val notificationmanager = Mynotificationmanager.getInstance()            val notification = notificationmanager.buildBeaconServiceNotification(this,"iBeacon service",null)            startForeground(NOTIFICATION_ID,notification)        }        initBeaconManager()    }    private fun initBeaconManager() {        BeaconManager.setDeBUG(true)        beaconManager = BeaconManager.getInstanceForApplication(this)        beaconManager?.foregroundScanPeriod = 200L        beaconManager?.beaconParsers?.add(BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"))        beaconManager?.bind(this)    }    overrIDe fun onBeaconServiceConnect() {        beaconManager?.addRangeNotifIEr { beacons,_ ->            if (beacons.isNotEmpty()) {                //code add ranged beacons to List            }        }        startRanging()    }    private fun startRanging() {        //code to reset the List of ranged beacons        beaconManager?.startRangingBeaconsInRegion(region)        rangingTimer.schedule(10000L) {            stopRanging(50000L)        }    }    private fun stopRanging(restartRangingAfter: Long? = null) {        beaconManager?.stopRangingBeaconsInRegion(region)        //code calcuate the strongest beacon and submit to server        if (restartRangingAfter != null) {            rangingTimer.schedule(restartRangingAfter) {                startRanging()            }        }    }}
最佳答案在OS版本8中,AndroID限制后台处理,除非它是前台服务或JobScheduler发起的作业的一部分.由于此限制,默认情况下,AndroID Beacon库将在AndroID 8上使用JobScheduler.在前台,“即时” ScanJob将不断运行以进行扫描.在后台(意味着在解锁屏幕后看不到任何活动的情况下),AndroID不允许这样做.每〜15分钟最多可以安排一次作业.这就是为什么您看到扫描停止的原因.

拥有自己的前台服务并不重要. AndroID仍会对在该前台服务之外执行的任何后台处理实施这些限制.

两种选择:

>不受工作限制(每15分钟扫描一次).使用BackgroundPowerSaver在前景/背景模式之间自动切换,并设置beaconManager.setBackgroundScanPeriod(5000)(每15分钟扫描5秒.)为清楚起见,还应设置beaconManager.setBackgroundBetweenScanPeriod(15 * 60 * 1000)(15分钟),尽管您可以设置一个较低的值,但AndroID 8上的 *** 作系统将不允许这样做.
>设置库以使用其自己的前台服务(是作为第二个前台服务)进行扫描,如here所述.然后,您可以停止使用自己的前台服务,也可以保留它.如果保留它,您将看到有关两个正在运行的前台服务的两个通知图标.如果要保留两个前台服务并仅显示一个通知,则可以选择combine those two notifications. 总结

以上是内存溢出为你收集整理的Android altbeacon在后台运行时间不等 全部内容,希望文章能够帮你解决Android altbeacon在后台运行时间隔不等 所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1145061.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存