gpt4 book ai didi

android - RadiusNetworks 库的 iBeacon 后台扫描 PRO 功能?

转载 作者:行者123 更新时间:2023-11-29 21:16:50 26 4
gpt4 key购买 nike

我正在使用 RadiusNetworks API 来处理 iBeacons。

我已经使用了这个库并且它工作正常,但是我不得不问我做错了什么,后台扫描没有在我的应用程序中发生?我错过了什么?

这是我到目前为止的实现,我只保留了与信标端相关的代码,但是将 Activity 设置为后台会完全停止扫描...

package ro.gebs.zonizbeacon;



public class MainActivity extends FragmentActivity
implements NavigationDrawerFragment.NavigationDrawerCallbacks, SearchView.OnQueryTextListener, IBeaconConsumer, RangeNotifier, IBeaconDataNotifier {
/**
* Fragment managing the behaviors, interactions and presentation of the navigation drawer.
*/
private NavigationDrawerFragment mNavigationDrawerFragment;
private MainOffersFragment mOffersFragment;

protected static final String TAG = "BeaconActivity";
private IBeaconManager iBeaconManager = IBeaconManager.getInstanceForApplication(this);


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

//getActionBar().setIcon(R.drawable.home);
setContentView(R.layout.activity_main);



BeaconUtils.verifyBluetooth(MainActivity.this);
iBeaconManager.bind(this);
}




@Override
protected void onDestroy() {
super.onDestroy();
iBeaconManager.unBind(this);
}

@Override
protected void onPause() {
super.onPause();
if (iBeaconManager.isBound(this)) iBeaconManager.setBackgroundMode(this, true);
}

@Override
protected void onResume() {
super.onResume();
if (iBeaconManager.isBound(this)) iBeaconManager.setBackgroundMode(this, false);

}


@Override
public void onIBeaconServiceConnect() {
Region region = new Region("MainActivityRanging", null, null, null);
try {
iBeaconManager.startRangingBeaconsInRegion(region);
iBeaconManager.setRangeNotifier(this);
} catch (RemoteException e) {
e.printStackTrace();
}
}

@Override
public void iBeaconDataUpdate(IBeacon iBeacon, IBeaconData iBeaconData, DataProviderException e) {
if (e != null) {
Log.d(TAG, "data fetch error:" + e);
}
if (iBeaconData != null) {
String displayString = iBeacon.getProximityUuid() + " " + iBeacon.getMajor() + " " + iBeacon.getMinor() + "\n" + "Welcome message:" + iBeaconData.get("welcomeMessage");
Log.d(TAG, displayString);
}
}

@Override
public void didRangeBeaconsInRegion(Collection<IBeacon> iBeacons, Region region) {
for (IBeacon iBeacon : iBeacons) {
iBeacon.requestData(this);
String displayString = iBeacon.getProximityUuid() + " " + iBeacon.getMajor() + " " + iBeacon.getMinor() + "\n";
Log.d(TAG, displayString);
}
}
}

最佳答案

您如何将 Activity 发送到后台?您是按后退按钮、主页按钮还是什么?

我怀疑发生的事情是 Android 实际上正在终止您的应用程序。您的 onDestroy 方法如下所示:

@Override
protected void onDestroy() {
super.onDestroy();
iBeaconManager.unBind(this);
}

如果 Android 调用此方法,iBeaconManager 将解除与 AndroidIBeaconService 的绑定(bind),从而有效地停止扫描。即使您删除此代码,如果 Android 决定终止该应用程序,它仍会自动终止该服务。

如果你想让它在后台运行,你需要将 IBeaconManager 附加到生命周期比该 Activity 更长的东西上。最简单的方法是使用像这样的自定义 Android 应用程序类(它也必须在您的 list 中声明):

public class MyTestIBeaconApplication extends Application {
private BackgroundPowerSaver backgroundPowerSaver;
private IBeaconManager iBeaconManager;

public void onCreate() {
super.onCreate();
// Simply constructing this class and holding a reference to it
// enables auto battery saving of about 60%
backgroundPowerSaver = new BackgroundPowerSaver(this);
iBeaconManager = IBeaconManager.getInstanceForApplication(this);
}
}

BackgroundPowerSaver 部分(仅在库的专业版中)是可选的,但当您的应用程序处于后台时会自动降低扫描频率以节省电池电量。如果您使用它,您不再需要在各种 onPauseonResume 方法中调用 setBackgroundMode

关于android - RadiusNetworks 库的 iBeacon 后台扫描 PRO 功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21190719/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com