Android 上的 AltBeacon 在第一个 运行 上变慢 8(应用程序没有响应)

AltBeacon on Android 8 slow on first run (app isn't responding)

仅在第一次启动应用程序时(在 uninstall/install 之后),在它开始扫描信标后,消息 "App isn't responding" 出现,仅在 Android 8(三星 A5 和J5 素数)。从应用程序中删除所有内容,只留下用于信标检测的代码,仍在发生。 不确定这是图书馆的问题还是我使用它的方式。

从我的应用程序调用 BeaconConsumer(context) class。

public class BeaconConsumer implements BootstrapNotifier, org.altbeacon.beacon.BeaconConsumer {
    BeaconManager beaconManager;
    BeaconConsumer(Context applicationContext) {
        beaconManager = BeaconManager.getInstanceForApplication(applicationContext);
        beaconManager.getBeaconParsers().clear();
        beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=6548,i:4-25,p:1-1"));
        beaconManager.setEnableScheduledScanJobs(false);
        beaconManager.setBackgroundBetweenScanPeriod(15300);
        beaconManager.setBackgroundScanPeriod(1200);
        beaconManager.setForegroundBetweenScanPeriod(10000);
        beaconManager.setForegroundScanPeriod(1200);
        beaconManager.bind(this);           
        beaconManager.setBackgroundMode(false);
        BeaconManager.setDebug(true);
        Region region = new Region("backgroundRegion", null, null, null);
        RegionBootstrap regionBootstrap = new RegionBootstrap(this, region);
    }

    public void onBeaconServiceConnect() {
        beaconManager.removeAllRangeNotifiers();
        beaconManager.addRangeNotifier((beacons, region) -> {
            Log.d("TAG", "didRangeBeaconsInRegion CALLED with size: " + beacons.size() + " on region: " + region);
            Iterator<Beacon> iterator = beacons.iterator();
            while (iterator.hasNext()) {
                Beacon beacon = iterator.next();
                Formatter formatter = new Formatter();
                for (byte b : beacon.getId1().toByteArray()) {
                    formatter.format("%02x", b);
                }
                String payload = formatter.toString();
                Log.d("TAG", "Processing payload: " + payload + " rssi: " + beacon.getRssi());
            }
        });

        try {
            beaconManager.startRangingBeaconsInRegion(myRegion);
        } catch (RemoteException e) {
            Log.d("TAG", "Exception starting ranging beacons in region");
        }
    }

    public void didEnterRegion(Region region) {
        try {
            beaconManager.startRangingBeaconsInRegion(region);
        } catch (RemoteException e) {
            Log.d("TAG", "Can't start ranging");
        }

        Intent intent = new Intent(mContext, BeaconService.class);
        intent.setAction("com.test.altbeacontest.beaconreference.Service.action.Scan");
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            mContext.startForegroundService(intent);
        } else {
            mContext.startService(intent);
        }
        mConnection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                Log.d("TAG", "ServiceConnection - connected");
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {
                Log.d("TAG", "ServiceConnection - disconnected");
            }
        };
        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
    }

    public void didExitRegion(Region region) {
        Log.d("TAG", "I no longer see a beacon.");
        insideRegion = false;

        try {
            beaconManager.stopRangingBeaconsInRegion(region);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
}

我怀疑问题与在同一方法中一起使用的这些操作有关:

beaconManager.bind(this);           
...
RegionBootstrap regionBootstrap = new RegionBootstrap(this, region);

你真的不应该一起使用这两个——通常你使用一个或另一个(绑定到 BeaconManager)或使用 RegionBootstrap。后一个对象本身在内部绑定。

我会删除:RegionBootstrap regionBootstrap = new RegionBootstrap(this, region); 并在您调用 beaconManager.startRangingBeaconsInRegion(myRegion);

的同时添加 beaconManager.startMonitoringBeaconsInRegion(region);