Фоновый BootstrapNotifier вместе с Activity с RangeNotifier с использованием AltBeacon

В настоящее время я пишу приложение для Android, которое использует Android-Beacon-Library AltBeacon (ранее Radius Network).

Мне нужно, чтобы приложение отображало уведомление при виде маяка, чего я добился с помощью Bootstrap Notifier, как подробно описано в примере кода здесь под заголовком Запуск приложения в фоновом режиме. (Изменение этого кода для отображения уведомления вместо запуска приложения).

Однако мне также требуется, чтобы приложение настроило RangeNotifier в другом действии, чтобы я мог измерять расстояния маяков от мобильного устройства. Я также сделал это, изменив пример кода в приведенной выше ссылке под заголовком Ranging Example Code.

Однако, когда я сделал это, мне показалось, что привязка к активности и настройка RangingNotifier, но при уничтожении активности она, похоже, не отвязывала BeaconConsumer, реализованную активностью, и код внутри функции didRangeBeaconsInRegion(...) продолжал выполняться, хотя onDestroy () звонили.

Поэтому я попытался вызвать beaconManager.stopRangingBeaconsInRegion(region); перед вызовом beaconManager.unbind(this);, и это, казалось, остановило выполнение кода в didRangeBeaconsInRegion(...), но после того, как активность была уничтожена, я все еще продолжал видеть сканирование Bluetooth LE неоднократно в журналах без задержки между каждым сканированием как таковым.

08-14 11:09:50.527: D/BluetoothAdapter(21572): stopLeScan()
08-14 11:09:50.537: D/BluetoothAdapter(21572): startLeScan(): null
08-14 11:09:50.547: D/BluetoothAdapter(21572): onClientRegistered() - status=0 clientIf=7

Часто, когда я загружаю новую сборку и возвращаюсь к определенному действию с помощью RangingNotifier, я получаю следующую ошибку:

java.lang.RuntimeException: An error occured while executing doInBackground()
    at android.os.AsyncTask$3.done(AsyncTask.java:300)
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
    at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
    at java.util.concurrent.FutureTask.run(FutureTask.java:242)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
    at java.lang.Thread.run(Thread.java:841)
Caused by: java.util.ConcurrentModificationException
    at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573)
    at org.altbeacon.beacon.service.BeaconService$ScanProcessor.doInBackground(BeaconService.java:609)
    at org.altbeacon.beacon.service.BeaconService$ScanProcessor.doInBackground(BeaconService.java:602)
    at android.os.AsyncTask$2.call(AsyncTask.java:288)
    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    ... 4 more

Это наводит меня на мысль, что BeaconManager, возможно, не отвязывается от Activity.

Можно ли использовать как фоновый мониторинг с помощью класса приложения, так и использовать RangingNotifier в действии в одном приложении?

Извините за длинный вопрос, похоже, нигде не нашел ничего подробного об этом!


person Dylan Turney    schedule 14.08.2014    source источник


Ответы (1)


Если бы я был на вашем месте, я бы имел все вещи, связанные с маяком, в вашем классе приложения, а затем использовал бы LocalBroadcastManager, чтобы сообщить другим частям вашего приложения о ранжировании: Предполагая, что RANGING_DONE является общедоступной статической финальной строкой RANGING_DONE = "RANGING_DONE";

Intent rangingDoneIntent = new Intent(YourAppClass.RANGING_DONE);
LocalBroadcastManager.getInstance(this).sendBroadcast(
            rangingDoneIntent);

Вы даже можете добавить маяки в Intent, поскольку они реализуют Parcelable.

Затем в своей деятельности прослушайте намерения RANGING_DONE:

LocalBroadcastManager.getInstance(this).registerReceiver(mRangingDoneReciever, new IntentFilter(YourAppClass.RANGING_DONE));

Где mRangingDoneReciever является BroadcastReciever:

private BroadcastReceiver mRangingDoneReciever = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        //Do something with the recieved ranging....
    }
}

Я надеюсь, что смогу использовать свой ответ...

/Стеффен

person Steffen Vangsgaard    schedule 27.10.2014