首页 > 解决方案 > 代号一后台操作

问题描述

我们正忙于开发具有以下要求的应用程序,

  1. 全天跟踪用户的位置,以便我们可以在地图上绘制他/她的路线
  2. 该应用程序应将所有信息本地存储在设备上,并且当设备能够连接到服务器时,它应该自动同步其数据。

为此,我们正在尝试使用 Background Location 和 Background Fetch 功能。我们创建了一个概念验证应用程序,它执行以下操作,

  1. 位置跟踪:位置侦听器只需将其坐标写入设备上的 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 数据库表中创建一条记录

  1. 后台获取: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。位置侦听器仅在初始化时触发一次。而且后台提取根本不会触发。

  1. 我们在植入这些功能时是否做错了什么?
  2. 如何调试这些函数来尝试看看出了什么问题?

标签: backgroundlocationcodenameonebackground-fetch

解决方案


推荐阅读