Android Beacon Library - 后台扫描

时间:2017-03-15 09:19:08

标签: android ibeacon android-bluetooth ibeacon-android android-ibeacon

我使用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
    }
}

我错过了什么吗?或者由于我的单独服务,这不是正确的方法吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

如果您的应用被杀死了#34;当然你不会扫描,因为你的App对象根本就不存在。

您需要的是使用foreground service,它始终在后台运行。此外,您需要在重新启动设备时考虑restart that service

答案 1 :(得分:0)

在这种情况下,了解Android Beacon Library的工作原理非常重要:

  1. 当您滑动屏幕的应用时,它会终止该过程。 Android Beacon Library将在发生这种情况后的5分钟内尝试重新启动其轻量级扫描服务(以及您在后台运行的应用程序)。如果是这样,它将是一个新流程,因此您仍会在Android Studio中看到与DEAD相同的内容,但下拉菜单中会出现一个新内容。

  2. 对于这种情况,库会持续跟踪区域状态。因此,如果您在杀死应用程序时已经在该区域内,则在重新启动时不会再进行第二次didEnterRegion呼叫。测试正在进行的操作的一种更简单的方法是在didDetermineStateForRegion内放置一条日志行,当应用程序启动时,无论状态如何,都会调用该日志行。

  3. 有一小部分Android设备使用非标准任务切换器以不允许重新启动的方式终止应用程序。万一您有这些设备之一,上述操作无效。为了确定,我会这样做:

    1. didDetermineStateForRegion

    2. 中添加新的日志行
    3. 在命令行上,运行adb logcat | grep Background以查找应用程序中的所有日志行,即使它使用不同的进程ID重新启动也是如此。

    4. 运行您的应用并验证您是否看到了日志输出。

    5. 杀死你的应用。

    6. 在观看日志输出的同时等待五分钟。您是否看到App started up或您为didDetermineStateForRegion添加的日志行?

    7. 编辑:根据评论中链接中提供的日志输出,我看到该应用程序正在作为进程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结束,所以我无法判断这是否按照设计进行。

相关问题