绑定beaconmanager时在后台启动应用程序

时间:2016-05-11 14:06:33

标签: android altbeacon android-ibeacon beacon

我在输入的区域显示我的应用时遇到问题,我按照示例here进行了操作。 当我将BeaconManager bind发送到我的Activty时,它可以工作,但是当我这样做时,我从活动中获取日志而不是来自应用程序,并且应用程序不会显示,尽管它已经显示了#39 ; s不可见。

所以问题是,我可以使用类extends Application implements BootstrapNotifier在后​​台启动应用程序,使用类extends AppCompatActivity implements BeaconConsumer来处理监视/测距,还是需要处理应用程序类中的所有内容,因为绑定它在活动中未通过后台启动?

(对不好的代码块,我只是无法正确处理这个stackoverflow代码)

    public class BeaconActivity extends AppCompatActivity implements BeaconConsumer {

    protected final String TAG = "BeaconActivity";
    private BeaconManager beaconManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate()");
        setContentView(R.layout.activity_beacon);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

       RangedBeacon.setSampleExpirationMilliseconds(8000);
       beaconManager = BeaconManager.getInstanceForApplication(this);
       beaconManager.bind(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "Unbind Beaconmanager");
        beaconManager.unbind(this);
    }

    @Override
    public void onBeaconServiceConnect() {
        beaconManager.setMonitorNotifier(new MonitorNotifier() {
            @Override
            public void didEnterRegion(final Region region) {
                Log.d(TAG, "Enter Region identifier: " + region.getId1() + ", " + region.getId2() + ", " + region.getId3());
            }

            @Override
            public void didExitRegion(final Region region) {
                Log.d(TAG, "Exit Region identifier: " + region.getId1() + ", " + region.getId2() + ", " + region.getId3());
            }

            @Override
            public void didDetermineStateForRegion(int state, Region region) {

            }
        });

        beaconManager.setRangeNotifier(new RangeNotifier() {
            @Override
            public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
                for (final Beacon beacon : beacons) {
                    final String distance = new DecimalFormat("##.######").format(beacon.getDistance());
                    Log.d(TAG, "Distance: " + distance + ". This beacon has identifiers:" + beacon.getId1() + ", " + beacon.getId2() + ", " + beacon.getId3());
                }
            }
        });

        try {
            Region region = new Region("all", null, null, null);
            beaconManager.startMonitoringBeaconsInRegion(all);
            beaconManager.startRangingBeaconsInRegion(all);
        } catch (RemoteException e) {
        }
    }
}



public class BeaconApplication extends Application implements BootstrapNotifier {

        private static final String TAG = "BeaconApplication";
        private RegionBootstrap regionBootstrap;

        @Override
        public void onCreate() {
            super.onCreate();
            Log.d(TAG, "App started up");
            BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this);
            beaconManager.getBeaconParsers().add(new BeaconParser().
                    setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25"));

            Region all = new Region("all", null, null, null);
            regionBootstrap = new RegionBootstrap(this, all);
        }

        @Override
        public void didEnterRegion(Region region) {
            Log.d(TAG, "Enter region " + region.getUniqueId());
    //        regionBootstrap.disable();
            Intent intent = new Intent(this, BeaconActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            this.startActivity(intent);
        }

        @Override
        public void didExitRegion(Region region) {
            Log.d(TAG, "Exit region " + region.getUniqueId());
        }

        @Override
        public void didDetermineStateForRegion(int i, Region region) {
        }
    }

修改 我想我可能只是搞砸了一下。解释here应用程序仅在被杀时启动(不再在任务切换器中)。如果它在任务切换器中可用,它只会在后台处理传入的事件,这就是我获取活动日志的原因。

1 个答案:

答案 0 :(得分:0)

问题是您的应用只能拥有一个 monitorNotifierRegionBootstrap类在内部设置一个,并使用它来获取Application类的回调。

上面显示的代码更改了此处的monitorNotifier

public void onBeaconServiceConnect() {
    beaconManager.setMonitorNotifier(new MonitorNotifier() {
...

执行该行之后,RegionBootstrap将不再获得进入/退出事件的回调,Application类也不会。问题不在于bind()来电,而是setMonitorNotifier来电。

该库不允许多个monitorNotifiers,因此如果您想继续使用RegionBootstrap,则必须重构代码,以便获取Application类中的所有进入/退出事件,以某种方式将它们传递给你的Activity