Android Beacon Library:当我想在应用程序启动后在后台频繁测距时,是否需要 BootstrapNotifer?

Android Beacon Library: Do I need the BootstrapNotifer when I want frequent ranging in background, after the application was launched?

我正在使用 Android Beacon Library 和 Android 8+ 开发一个应用程序,我需要在后台进行测距。为此,我使用本地支持的可能性将服务作为前台服务启动。 即使应用程序关闭,应用程序也应保持范围!因此,在 activity 中实现 BeaconConsumer 接口不是一个好主意,因为如果从内存范围中删除 Acitivity 显然会停止。 为了解决这个问题,我创建了一个自定义应用程序 class 并实施了一个 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. RegionBoostrap 只是一个帮手 class,旨在使用 Application [=62] 中的监控更轻松地在应用程序启动时设置自动信标检测=].您可以使用 beaconManager.bind(...) 执行相同的操作,然后在 onBeaconServiceConnected 回调中开始监控。

  2. 由于您只关心范围而不是监控(对于您的用例来说完全合法),那么像您一样手动设置是一种更简单的方法,因为它避免了 RegionBootstrap 创建的不必要的监控。

  3. 如果您希望您的应用程序自动恢复以响应信标事件,关键是将设置它的代码放在自定义应用程序的 onCreate 方法中 class .如果这样做,使用 BootstrapNotifierBeaconConsumer 都没有关系。

为什么 Application.onCreate 如此重要?

该库设置了许多挂钩,在许多情况下会请求应用重启以进行信标扫描:

  1. 如果您使用默认 JobScheduler 而不是前台服务
  2. ,则 Android 每 ~15 分钟 8+
  3. 启动时
  4. 在 Android 8+ 上使用硬件过滤器检测到与远程或监视信标匹配的信标后。
  5. 在内部 BeaconService(当前台服务在 Android 8+ 或始终在 Android 7 及更早版本上处于活动状态时使用)被杀死后(由于内存压力)
  6. 应用停止后 5 分钟内(在 Android 7 及更早版本上)

在上述所有情况下,使重新启动信标扫描成为可能的原因是 Application.onCreate 中有代码。该方法是 Android 应用程序启动时执行的第一个应用程序级代码。因此,如果您在此处设置您的库初始化,那么初始化将在上述任何事件上完成,您将恢复信标扫描,就好像您的应用程序从未停止过一样 运行。