Фоновая служба библиотеки маяков Android - задержка пользовательского интерфейса при воспроизведении видео или загрузке некоторых данных API - PullRequest
0 голосов
/ 17 мая 2019

Я разрабатываю сканер приложений маяка (в фоновом режиме, когда Bluetooth активирован) с Android Beacon Library . Проблема заключается в том, что всякий раз, когда я активирую сканер в качестве фона и пытаюсь воспроизвести видео с MediaController в другом действии или загрузить некоторые данные API, видео не воспроизводится или иногда воспроизводится с задержкой и аналогично загрузке API действие.

Но при отключении сканера все работает нормально.

Я не знаю, выполняет ли библиотека свои сервисы в другом потоке или в том же потоке, который блокирует пользовательский интерфейс, поэтому я хочу знать, как решить эту проблему с помощью многозадачного решения, если это возможно.

Я использовал huawei HOL-19, API19

это файл CustomApplication:


import android.R
import android.app.*
import android.content.Context
import android.content.Intent
import android.os.*
import android.util.Log
import com.example.anymarketmobile.views.subactivities.HomeActivity
import org.altbeacon.beacon.*
import org.altbeacon.beacon.powersave.BackgroundPowerSaver
import org.altbeacon.beacon.startup.BootstrapNotifier
import org.altbeacon.beacon.startup.RegionBootstrap

class BackgrounApplicationBeacons : Application(), BeaconConsumer, RangeNotifier {
    //  Init Properties
    lateinit var mBeaconManager: BeaconManager
    var mRegion: Region? = null
    var mMonitor = false
    var mLastDetectedBeacon: Beacon? = null
    val TAG = "==>"

    //  Actions & Callbacks
    override fun onBeaconServiceConnect() {
        mBeaconManager.addRangeNotifier(this)
        try {
            mBeaconManager.startRangingBeaconsInRegion(mRegion!!)
        } catch (e: RemoteException) {
        }
    }

    override fun didRangeBeaconsInRegion(beacons: MutableCollection<Beacon>?, region: Region?) {
        Log.i("==>Beacons:", "${beacons?.size}")
        if (beacons?.size!! > 0) {
            val beacon = beacons.iterator().next()
            if (beacon.id1 != mLastDetectedBeacon?.id1) {
                Log.i("${TAG}beacon detected:", "${beacon.id1} , ${beacon.distance} m")
                mLastDetectedBeacon = beacon
            }
        }
    }

    //  Start monitoring beacons
    fun startMonitoring() {
        mBeaconManager = BeaconManager.getInstanceForApplication(this)
        Log.i("==>", "Application launched:")
        if (mBeaconManager.isMainProcess) {
            mBeaconManager.beaconParsers.clear()
            mBeaconManager.beaconParsers.add(
                BeaconParser().setBeaconLayout(Constants.DEFAULT_BEACONS_LAYOUT)
            )
            mBeaconManager.setEnableScheduledScanJobs(false)
            val backgroundPowerSaver = BackgroundPowerSaver(this)
            mBeaconManager.backgroundBetweenScanPeriod = 0
            mBeaconManager.backgroundScanPeriod = 2100
            mRegion = Region("test", null, null, null)
            // mRegionBootstrap = RegionBootstrap(this, mRegion)
            mMonitor = true
            val builder = notificationBuilder()
            mBeaconManager.enableForegroundServiceScanning(builder.build(), 456)
            Log.i(TAG, "startMonitoring")
            mBeaconManager.applySettings()
            mBeaconManager.bind(this)

        }
    }

    //  Stop monitoring beacons
    fun stopMonitoring() {
        mRegion = null
        mBeaconManager.removeRangeNotifier(this)
        mBeaconManager.unbind(this)
        /*mRegionBootstrap?.disable()
        mRegionBootstrap = null*/
        Log.i(TAG, "stopMonitoring")
        mMonitor = false
        mLastDetectedBeacon = null
    }

    fun isMonitoring() = mMonitor


    //  Forground notification builder
    private fun notificationBuilder(): Notification.Builder {
        val builder = Notification.Builder(this)
        builder.setSmallIcon(R.drawable.ic_search_category_default)
        builder.setContentTitle("Scanning for Beacons")
        val intent = Intent(this, HomeActivity::class.java)
        intent.putExtra(Constants.FOREGROUND_SERVICE_COMMUNICATION_BEACON_SCAN, mMonitor)
        val pendingIntent = PendingIntent.getActivity(
            this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT
        )
        builder.setContentIntent(pendingIntent)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val channel = NotificationChannel(
                "My Notification Channel ID",
                "My Notification Name", NotificationManager.IMPORTANCE_DEFAULT
            )
            channel.description = "My Notification Channel Description"
            val notificationManager = getSystemService(
                Context.NOTIFICATION_SERVICE
            ) as NotificationManager
            notificationManager.createNotificationChannel(channel)
            builder.setChannelId(channel.id)
        }
        return builder
    }
}

Я ожидал избежать задержки или медленного исполнения.

1 Ответ

1 голос
/ 17 мая 2019

Большая часть работы Bluetooth-стека Android выполняется в потоке пользовательского интерфейса - например, все обратные вызовы обнаружения выполняются в потоке пользовательского интерфейса. Библиотека маяков Android поддерживает собственный пул фоновых потоков и сразу же переключает обработку обнаружения на фоновый поток с более низким приоритетом, как только пакет поступает из операционной системы. В результате накладные расходы на обработку библиотеки в потоке пользовательского интерфейса минимальны - ограничиваются просто передачей работы другому потоку для каждого увиденного пакета.

Тем не менее, часть операционной системы обработки обнаружения BLE - это отдельная история, и некоторые из них выполняются в потоке пользовательского интерфейса. Я был бы удивлен, если бы в потоке пользовательского интерфейса при сканировании BLE происходила значительная обработка ОС Android, если только одновременно не было видно очень большое количество устройств BLE. Я специально не тестировал это на Huawei HOL-19, но я протестировал его на стандартных устройствах Android (например, на устройствах Pixel и Nexus) и подтвердил, что обработка пользовательского интерфейса минимальна в тех случаях, когда видны дюжина или меньше устройств BLE.

Вы можете попробовать другое устройство, чтобы увидеть, может ли это быть проблема Huawei HOL-19.

...