RegionBootstrap的后期初始化

时间:2015-02-20 04:45:24

标签: android altbeacon android-ibeacon

在参考应用程序中,RegionBootstrap在其 onCreate方法自定义应用程序类中初始化,当然,在任何活动之前调用应用程序类叫做。

有没有办法在活动中初始化RegionBootstrap?我已经尝试过创建RegionBootstrap的静态变量,所以我可以在不同的活动中调用它,但不幸的是,它不起作用。

BeaconApplication.regionBootstrap = new RegionBootstrap((BootstrapNotifier) this.getApplication(), downloadedBeacons);

我需要初始化的区域将来自服务器,因此RegionBootstrap的初始化不得来自应用程序类。

*编辑*

public class LoginActivity extends ActionBarActivity {
    …
    /*** short version ***/
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        /*** after successful login ***/
        BeaconApplication.beacons = downloadBeaconsFromServer();    
    }
}

public class BeaconActivity extends ActionBarActivity {
    …
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        …
        startService(new Intent(this, BeaconService.class));
    }
}

这是我实施BeaconConsumer

的地方
public class BeaconService extends Service implements BeaconConsumer {
    private BeaconManager beaconManager;
    private BeaconNotifier beaconNotifier;
    private RegionBootstrap regionBootstrap;

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG, "onCreate");
        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"));
        beaconManager.setBackgroundBetweenScanPeriod(1001);
        beaconManager.setBackgroundScanPeriod(101);
        beaconManager.setForegroundScanPeriod(101);
        beaconManager.setForegroundBetweenScanPeriod(1001);
        beaconNotifier = new BeaconNotifier(this);
        beaconManager.bind(this);
    }

    @Override
    public void onBeaconServiceConnect() {
        beaconManager.setMonitorNotifier(beaconNotifier);
        monitorBeacons();

        regionBootstrap = new RegionBootstrap(beaconNotifier, BeaconApplication.beacons);
    }

    private void monitorBeacons() {
        for (Region beacon : BeaconApplication.beacons) {
            try {
                Log.i(TAG, "Monitoring beacon " + beacon.getUniqueId());
                beaconManager.startMonitoringBeaconsInRegion(beacon);
            } catch (RemoteException e) {
                Log.e(TAG, "Monitoring beacon failed");
                e.printStackTrace();
            }
        }
    }
}

BeaconNotifier

的实施
public class BeaconNotifier implements BootstrapNotifier {
    private Context context;

    public BeaconNotifier(Context context) {
            this.context = context;
    }

    @Override
    didEnter.. etc

    @Override
    public Context getApplicationContext() {
            return context;
    }
}

1 个答案:

答案 0 :(得分:1)

您可以使用:

BeaconManager.setMonitorNotifier(MonitorNotifier);
BeaconManager.startMonitoringBeaconsInRegion(Region);

但不要忘记,为了使用BeaconManager方法,您必须等到BeaconService连接。请注意,使用此方法,即使应用程序被杀,您也需要创建自己的服务。

顺便说一句,我记得,一旦我遇到RegionBootstrap的问题。我用一个技巧来处理这个问题。你能测试下面的代码吗?

...
BeaconManager.bind(yourConsumer);
...
//wait until BeaconConsumer.onBeaconServiceConnect() is called
//write following code inside of onBeaconServiceConnect
RegionBootstrap dummy = new RegionBootstrap(mBootstrapNotifier, new Region("dummy", null, null, null));
dummy.disable();
//after this point you can create your own RegionBootstrap

这里有一个关键点,你需要创建自己的BootstrapNotifier。如果您在活动中执行此操作,则可以执行以下操作:

public class YourActivity extends Activity implements BootstrapNotifier {
    ...
    BootstrapNotifier mBootstrapNotifier = this;
    ...

Application班:

public class YourApp extends Application implements BootstrapNotifier {
    ...
    BootstrapNotifier mBootstrapNotifier = this;
    ...

在我的情况下,我创建了一个适配器,并且该适配器在其构造函数中需要Context,并且我已将该适配器用作BootstrapNotifier

public class AltBeaconAdapter implements BootstrapNotifier {
    private Context mContext;
    ...

    public AltBeaconAdapter(Context context) {
        mContext = context;
        ...
    }

    @Override
    public Context getApplicationContext() {
        return mContext;
    }

    ...
}

此外,您必须实施MonitorNotifier方法,因为BootstrapNotifierMonitorNotifier的子类。

是的,这个技巧很奇怪,它显示库中有一个错误,初始化RegionBootstrap但是我有服务所以我切换到我向你提议的第一个方法。如果这个技巧也适合你,请告诉我,以便我可以在库的GitHub页面上创建一个问题。