background - 代号一后台操作
问题描述
我们正忙于开发具有以下要求的应用程序,
- 全天跟踪用户的位置,以便我们可以在地图上绘制他/她的路线
- 该应用程序应将所有信息本地存储在设备上,并且当设备能够连接到服务器时,它应该自动同步其数据。
为此,我们正在尝试使用 Background Location 和 Background Fetch 功能。我们创建了一个概念验证应用程序,它执行以下操作,
- 位置跟踪:位置侦听器只需将其坐标写入设备上的 SQLite 数据库以供以后使用。
后台监听器的设置
LocationManager locMan = LocationManager.getLocationManager();
if (locMan == null) {
Dialog.show("Location Error", "Location Manager not found", "OK", null);
} else {
if (!locMan.isGPSDetectionSupported()) {
Dialog.show("Location Error", "GPS detection not supported.", "OK", null);
} else {
if (!locMan.isGPSEnabled()) {
Dialog.show("Location Error", "GPS not enabled. Please close the app, turn on your location and try again.", "OK", null);
} else {
if (locMan.isBackgroundLocationSupported()) {
locMan.setBackgroundLocationListener(LocationListener.class);
Dialog.show("Location", "Background location listener loaded.", "OK", null);
} else {
Dialog.show("Location Error", "Background location not supported", "OK", null);
}
}
}
}
而监听器类本身,
public class LocationListener implements com.codename1.location.LocationListener {
@Override
public void locationUpdated(Location arg0) {
String msg = arg0.getLatitude() + " - " + arg0.getLongitude();
ASDTester.logMsg(ASDTester.MSG_LOC_COORDS, msg);
}
@Override
public void providerStateChanged(int arg0) {
String msg = "" + arg0;
ASDTester.logMsg(ASDTester.MSG_LOC_STATE_CHANGED, msg);
}
}
调用 ASDTester.logMsg(int type, String msg) 只是在 SQLite 数据库表中创建一条记录
- 后台获取:performBackgroundFetch 实现还将一条消息记录到 SQLite 数据库,存储方法触发时的时间戳,
设置后台获取间隔,
if (Display.getInstance().isBackgroundFetchSupported()) {
Display.getInstance().setPreferredBackgroundFetchInterval(60);
Dialog.show("Background", "Background Fetch Interval set", "OK", null);
} else {
Dialog.show("Background Error", "Background Fetch Not Supported", "OK", null);
}
实现 performBackgroundFetch
@Override
public void performBackgroundFetch(long arg0, Callback<Boolean> arg1) {
logMsg(MSG_BGF_TIMESTAMP, System.currentTimeMillis() + "");
arg1.onSucess(Boolean.TRUE);
}
最后是 iOS 的构建提示,
ios.background_modes=fetch,location
该实现不适用于 Android 或 iOS。位置侦听器仅在初始化时触发一次。而且后台提取根本不会触发。
- 我们在植入这些功能时是否做错了什么?
- 如何调试这些函数来尝试看看出了什么问题?
解决方案
推荐阅读
- javascript - D3.js 是否可以使用嵌套数据在每个点上绘制圆圈?
- javascript - 我的 JSON 输出仅打印 [object] 而不是值
- java - 如何在 Tomcat 8 中将多个展开的 webapps($CATALINA_BASE/webapps 之外)设置为 ROOT?
- python - Cannot get the emulator running for my Android App using beeware (newbie)
- java - Writing a program to check password for certain things
- python - Python: How to: attribute of an instance which depends on flag, which is itself an attribute of that instance / object
- javascript - How to get attribute value from Html through axios request?
- reactjs - Can't resolve export default from 'xxxx' in index.js vscode when ctrl/cmd click imports
- c++ - Constexpr: Convert a list of string views into a list of char arrays
- javascript - Complete and uncompleted todos