在Activity而不是Application类上实现BootstrapNotifier

时间:2016-01-16 06:36:52

标签: android altbeacon beacon eddystone

我正在使用altBeacon库进行信标检测。在Beacon检测中检出示例代码后,他们总是在BootstrapNotifier类而不是Application上实现接口Activity,后者用于检测后台的信标。但是我注意到在BootstrapNotifier上实施Activity时后台中的信标检测停止了。我不希望我的应用程序在启动后立即检测到信标,因此我没有在BootStrapNotifier类上实现Application。我有一个特定的要求,我希望信标只能在检测到之后被检测到启动特定的Activity,然后始终在后台检测信标。 altBeacon库是否有任何实现此目的的规定?感谢。

Sample code

1 个答案:

答案 0 :(得分:3)

是的,只有在Activity启动后才能在后台检测到信标,但您仍需要创建一个实现Application的自定义BootstrapNotifier类。

这是必要的原因是因为Android生命周期。如果从前台取出Activity,则可以退出Activity,进入新的Application,或者操作系统以低内存条件终止它。

在低内存情况下,整个应用程序(包括Activity类实例(和信标扫描服务))将与onCreate一起终止。这种情况完全超出了您的控制范围,但Android Beacon Library的代码可以在发生这种情况几分钟后自动重启应用程序和信标扫描服务。

出于您的目的,棘手的部分是在Application类的Activity方法中弄清楚这是应用程序重启(低内存关闭后),还是第一次启动在Activity运行之前的应用程序。

执行此操作的一种好方法是在Application发布public void onCreate() { ... SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); long lastActivityLaunchTime = prefs.getLong("myapp_activity_launch_time_millis", 0l); if (lastActivityLaunchTime > System.currentTimeMillis()-SystemClock.elapsedRealtime() ) { // If we are in here we have launched the Activity since boot, and this is a restart // after temporary low memory shutdown. Need to start scanning startBeaconScanning(); } } public void startBeaconScanning() { Region region = new Region("backgroundRegion", null, null, null); mRegionBootstrap = new RegionBootstrap(this, region); mBackgroundPowerSaver = new BackgroundPowerSaver(this); } 时存储时间戳。

因此,您的Activity类可能包含以下代码:

public void onCreate() {
  ...
  SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
  long lastActivityLaunchTime = prefs.getLong("myapp_activity_launch_time_millis", 0l);
  if (lastActivityLaunchTime < System.currentTimeMillis()-SystemClock.elapsedRealtime() ) {
    // This is the first Activity launch since boot
    ((MyApplication) this.getApplicationContext()).startBeaconScanning();
    SharedPreferences.Editor prefsEditor = prefs.edit();
    prefsEditor.putLong("myapp_activity_launch_time_millis", System.currentTimeMillis());
    prefsEditor.commit();
  }
}

import requests url = "https://www.woolworths.com.au/apis/ui/Search/products?IsMultisearch=true&IsSpecial=false&PageNumber=1&PageSize=5&SearchTerm=chicken&SortType=Relevance" r = requests.get(url) data = r.json() 中,您还需要使用代码检测它是第一次启动,如果是,请从那里开始扫描。

woolies_data=(requests.get(api_woolies))