在尝试停止并重新启动altbeacon中的前台扫描时,我目前对粘性通知感到头痛。
我要做什么: 用户在我的应用程序中按下按钮后,我想开始在车辆中扫描Bluetooth LE信标。应用程序应注意用户是否离开了车辆(事件区域左侧)并执行了一些操作。之后,用户可以返回登录屏幕并再次开始该过程。 当应用程序最小化时,信标检测仍将正常工作。
我当前的解决方案:
我在Application类中实现了Altbeacon。在Applications onCreate中,我初始化BeaconManager(getInstance,设置BeaconParsers等)。
当用户单击按钮时,我致电startMonitoring
开始前台扫描:
public void startMonitoring() {
Notification.Builder builder = new Notification.Builder(this);
builder.setSmallIcon(R.drawable.notificationicon);
builder.setContentTitle("Content Title");
builder.setContentText("Content Text");
Intent intent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(
this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT
);
builder.setContentIntent(pendingIntent);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel("ChannelId", "ChannelName", NotificationManager.IMPORTANCE_LOW);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
Objects.requireNonNull(notificationManager).createNotificationChannel(channel);
builder.setChannelId(channel.getId());
}
beaconManager.enableForegroundServiceScanning(builder.build(), 12345);
beaconManager.setEnableScheduledScanJobs(false);
beaconManager.setBackgroundBetweenScanPeriod(0);
beaconManager.setBackgroundScanPeriod(1100);
beaconManager.bind(this);
}
当我检测到用户离开车辆时,我致电stopMonitoring
停止前台扫描并删除通知:
public void stopMonitoring() {
beaconManager.unbind(this);
beaconManager.disableForegroundServiceScanning();
}
禁用前景扫描通常应删除粘性通知,或者至少使其(通过滑动)可移动给用户。事实并非如此。 我可以通过删除通知渠道来删除通知:
public void stopMonitoring() {
[...]
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.deleteNotificationChannel("ChannelId");
}
}
但是当我这样做时,该应用将不会再次显示通知。
有人知道如何正确停止和重新启动前台扫描吗?