我使用Android Beacon Library用手机扫描Eddystone信标。应用程序正在前台正常运行。
现在,我想在后台模式中检测Eddytone信标,但该网站的示例不能在我的应用程序上运行。
在我的情况下,我有一个UI活动和一个单独的服务用于前景信标检测。
我的示例代码完全相同,我的活动的launchMode是“singleInstance”。
这是我的代码:
public class Background extends Application implements BootstrapNotifier{
private static final String TAG = "Background";
private RegionBootstrap regionBootstrap;
@Override
public void onCreate() {
super.onCreate();
Log.e(TAG, "App started up");
BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this);
beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout(BeaconParser.EDDYSTONE_UID_LAYOUT));
beaconManager.setBackgroundScanPeriod(1100L);
beaconManager.setBackgroundBetweenScanPeriod(5000);
Region region = new Region("all", null, null, null);
regionBootstrap = new RegionBootstrap(this, region);
}
@Override
public void didDetermineStateForRegion(int arg0, Region arg1) {
// Don't care
}
@Override
public void didEnterRegion(Region arg0) {
Log.e(TAG, "Got a didEnterRegion call");
regionBootstrap.disable();
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
this.startActivity(intent);
}
@Override
public void didExitRegion(Region arg0) {
// Don't care
}
}
我错过了什么吗?或者由于我的单独服务,这不是正确的方法吗?
感谢您的帮助。
答案 0 :(得分:0)
如果您的应用被杀死了#34;当然你不会扫描,因为你的App对象根本就不存在。
您需要的是使用foreground service,它始终在后台运行。此外,您需要在重新启动设备时考虑restart that service。
答案 1 :(得分:0)
在这种情况下,了解Android Beacon Library的工作原理非常重要:
当您滑动屏幕的应用时,它会终止该过程。 Android Beacon Library将在发生这种情况后的5分钟内尝试重新启动其轻量级扫描服务(以及您在后台运行的应用程序)。如果是这样,它将是一个新流程,因此您仍会在Android Studio中看到与DEAD相同的内容,但下拉菜单中会出现一个新内容。
对于这种情况,库会持续跟踪区域状态。因此,如果您在杀死应用程序时已经在该区域内,则在重新启动时不会再进行第二次didEnterRegion
呼叫。测试正在进行的操作的一种更简单的方法是在didDetermineStateForRegion
内放置一条日志行,当应用程序启动时,无论状态如何,都会调用该日志行。
有一小部分Android设备使用非标准任务切换器以不允许重新启动的方式终止应用程序。万一您有这些设备之一,上述操作无效。为了确定,我会这样做:
在didDetermineStateForRegion
在命令行上,运行adb logcat | grep Background
以查找应用程序中的所有日志行,即使它使用不同的进程ID重新启动也是如此。
运行您的应用并验证您是否看到了日志输出。
杀死你的应用。
在观看日志输出的同时等待五分钟。您是否看到App started up
或您为didDetermineStateForRegion
添加的日志行?
编辑:根据评论中链接中提供的日志输出,我看到该应用程序正在作为进程ID 6863运行,检测信标暂时:
03-28 14:31:17.540 6863 6863 E Background: App started up
...
03-28 14:31:18.196 6863 6935 E Background: Got a didEnterRegion call
...
03-28 14:31:23.550 6863 6863 E MainActivity: Beacons received
然后出现这些条目:
03-28 14:31:24.932 928 1913 I MediaProcessHandler: processOp opType: 1, uid: 10138, pid: 6863
03-28 14:31:24.932 928 1913 W MediaProcessHandler: remove target not exist, maybe the UI process: uid: 10138, pid: 6863
在这个非标准的Android操作系统风格中,一个名为MediaProcessHandler的类似乎正在杀死上述过程。在这种情况下,Android Beacon Library使用AlarmManager在最后一次扫描后5分钟重新开始扫描,这应该在14:36:23关闭以恢复扫描。不幸的是,日志以03-28 14:33:28.553
结束,所以我无法判断这是否按照设计进行。