Библиотека Android Beacon: нужен ли BootstrapNotifer, когда я хочу частое ранжирование в фоновом режиме после запуска приложения? - PullRequest
0 голосов
/ 19 июня 2019

Я работаю над приложением с библиотекой Android Beacon с Android 8+, и мне нужно выполнить ранжирование в фоновом режиме.Для этого я использую нативно поддерживаемую возможность запустить сервис в качестве приоритетного сервиса.Приложение должно сохранять дальность, даже когда приложение закрыто!Таким образом, реализация интерфейса BeaconConsumer в действии не является хорошей идеей, так как, если удаление чувствительности из диапазона памяти, очевидно, прекратится.Чтобы обойти это, я создал собственный класс приложения и реализовал BeaconConsumer и начал разбираться в этом компоненте.Таким образом, пользовательское приложение является Потребителем и обрабатывает результаты в методе onServiceConnect (...).Нужно ли BootstrapNotifier для моей цели, или он будет работать так?Будет ли приложение продолжать ранжироваться, если приложение закрыто?

public class App extends Application implements BeaconConsumer {
   onCreate(){
     mbeaconManager = 
     org.altbeacon.beacon.BeaconManager.getInstanceForApplication(this);
     mbeaconManager.setDebug(true);

    // Create Notification for the Foreground Service
    Intent intent = new Intent(this, MainActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(
            this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT
    );

    Notification notification = new 
    NotificationCompat.Builder(getApplicationContext(),CHANNEL_1_ID)
            .setSmallIcon(R.drawable.icon)
            .setContentTitle("\"Ranging runs in background!")
            .setContentIntent(pendingIntent)
            .build();

    // Set Scanning Settings
    mbeaconManager.enableForegroundServiceScanning(notification, 
    notificationID);
    mbeaconManager.setEnableScheduledScanJobs(false);
    mbeaconManager.setBackgroundBetweenScanPeriod(100);
    mbeaconManager.setBackgroundScanPeriod(100);
  }

    public void onBeaconServiceConnect() {
        mbeaconManager.removeAllRangeNotifiers();
        mbeaconManager.addRangeNotifier(new RangeNotifier() {

         public void didRangeBeaconsInRegion(...) { 
         // handle found beacons
      }

       mbeaconManager.startRangingBeaconsInRegion(...);
   }
 }
}

1 Ответ

0 голосов
/ 19 июня 2019

То, что у тебя, выглядит отлично.Несколько советов, которые вы должны полностью понять:

  1. RegionBoostrap - это просто вспомогательный класс, разработанный для упрощения настройки автоматического определения маяка при запуске приложения с использованием мониторинга в Applicationучебный класс.Вы можете сделать то же самое с beaconManager.bind(...), а затем начать мониторинг в обратном вызове onBeaconServiceConnected.

  2. Так как вы заботитесь только об определении дальности, а не о мониторинге (что совершенно справедливо для вашего случая использования), то настройка вручную, как вы сделали, является более простым способом, так как позволяет избежать ненужного мониторинга, создаваемогоRegionBootstrap.

  3. Если вы хотите, чтобы ваше приложение автоматически возобновляло реакцию на события маяка, главное, чтобы этот код был помещен в метод onCreate пользовательского класса Application.,Если вы делаете это, не имеет значения, используете ли вы BootstrapNotifier или BeaconConsumer.

Почему Application.onCreate так важно?

Библиотека устанавливает несколько ловушек, которые будут запрашивать перезапуск приложения для сканирования маяка в ряде случаев:

  1. Каждые ~ 15 минут на Android 8+, если вы используете значение по умолчанию JobScheduler вместо службы Foreground
  2. при загрузке
  3. После обнаружения маяка, соответствующего ранжированному или контролируемому маяку, с использованием аппаратного фильтра на Android 8 +.
  4. После внутреннегоBeaconService (используется, когда служба переднего плана активна на Android 8+ или всегда на Android 7 и более ранних версиях) уничтожается (из-за нехватки памяти)
  5. В течение 5 минут после остановки приложения в противном случае (на Android 7и ранее)

Во всех вышеперечисленных случаях возможен перезапуск сканирования маяка - наличие кода в Application.onCreate.Этот метод - самый первый код уровня приложения, который выполняется при запуске приложения Android.Поэтому, если вы настроили инициализацию вашей библиотеки здесь, то инициализация будет выполнена для любого из вышеупомянутых событий, и вы возобновите сканирование маяка, как будто ваше приложение никогда не прекращало работать вообще.

...