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(...);
}
}
}
你的看起来不错。几个要点让你全面了解:
RegionBoostrap
只是一个帮手 class,旨在使用 Application
[=62] 中的监控更轻松地在应用程序启动时设置自动信标检测=].您可以使用 beaconManager.bind(...)
执行相同的操作,然后在 onBeaconServiceConnected
回调中开始监控。
由于您只关心范围而不是监控(对于您的用例来说完全合法),那么像您一样手动设置是一种更简单的方法,因为它避免了 RegionBootstrap 创建的不必要的监控。
如果您希望您的应用程序自动恢复以响应信标事件,关键是将设置它的代码放在自定义应用程序的 onCreate 方法中 class .如果这样做,使用 BootstrapNotifier
或 BeaconConsumer
都没有关系。
为什么 Application.onCreate
如此重要?
该库设置了许多挂钩,在许多情况下会请求应用重启以进行信标扫描:
- 如果您使用默认
JobScheduler
而不是前台服务 ,则 Android 每 ~15 分钟 8+
- 启动时
- 在 Android 8+ 上使用硬件过滤器检测到与远程或监视信标匹配的信标后。
- 在内部
BeaconService
(当前台服务在 Android 8+ 或始终在 Android 7 及更早版本上处于活动状态时使用)被杀死后(由于内存压力)
- 应用停止后 5 分钟内(在 Android 7 及更早版本上)
在上述所有情况下,使重新启动信标扫描成为可能的原因是 Application.onCreate 中有代码。该方法是 Android 应用程序启动时执行的第一个应用程序级代码。因此,如果您在此处设置您的库初始化,那么初始化将在上述任何事件上完成,您将恢复信标扫描,就好像您的应用程序从未停止过一样 运行。
我正在使用 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(...);
}
}
}
你的看起来不错。几个要点让你全面了解:
RegionBoostrap
只是一个帮手 class,旨在使用Application
[=62] 中的监控更轻松地在应用程序启动时设置自动信标检测=].您可以使用beaconManager.bind(...)
执行相同的操作,然后在onBeaconServiceConnected
回调中开始监控。由于您只关心范围而不是监控(对于您的用例来说完全合法),那么像您一样手动设置是一种更简单的方法,因为它避免了 RegionBootstrap 创建的不必要的监控。
如果您希望您的应用程序自动恢复以响应信标事件,关键是将设置它的代码放在自定义应用程序的 onCreate 方法中 class .如果这样做,使用
BootstrapNotifier
或BeaconConsumer
都没有关系。
为什么 Application.onCreate
如此重要?
该库设置了许多挂钩,在许多情况下会请求应用重启以进行信标扫描:
- 如果您使用默认
JobScheduler
而不是前台服务 ,则 Android 每 ~15 分钟 8+
- 启动时
- 在 Android 8+ 上使用硬件过滤器检测到与远程或监视信标匹配的信标后。
- 在内部
BeaconService
(当前台服务在 Android 8+ 或始终在 Android 7 及更早版本上处于活动状态时使用)被杀死后(由于内存压力) - 应用停止后 5 分钟内(在 Android 7 及更早版本上)
在上述所有情况下,使重新启动信标扫描成为可能的原因是 Application.onCreate 中有代码。该方法是 Android 应用程序启动时执行的第一个应用程序级代码。因此,如果您在此处设置您的库初始化,那么初始化将在上述任何事件上完成,您将恢复信标扫描,就好像您的应用程序从未停止过一样 运行。