代号一:后台位置侦听器没有在Android棒棒糖上启动



我正在构建一个应用程序,它应该定期捕捉用户的位置(我每60分钟寻找一次),跟踪他们访问过的城市。

我刚开始使用前台位置侦听器,它非常完美,似乎每隔几分钟就会启动一次,但我已经进行了检查,这样它只有在经过足够的时间后才能真正跟踪位置。当我切换到其他应用程序时,前台侦听器似乎会继续启动一段时间,然后停止启动,这对我来说是有道理的,因为我认为操作系统正在备份应用程序。在这一点上,我希望后台侦听器已经注册,并在该侦听器被解雇时唤醒应用程序。

关于我的问题。。。我的后台位置监听器有问题。我知道它不会在模拟器上启动,但当我为设备构建调试(使用内置证书)时,它也不会启动。为了回答这个问题,我根据这里列出的例子,将我的应用程序的功能提炼为基本功能:https://gist.github.com/shannah/86c739edac34216d3c4d

为了确保我尝试将后台侦听器切换到标准的前台侦听器(.setLocationListener(new BackgroundListener())),并在模拟器上运行,我可以验证我的标签是否用适当的数据更新。

我还对我的实际应用程序进行了一些测试,在无参数构造函数中弹出一个对话框,表示侦听器已初始化,在调用locationUpdated时弹出另一个对话框。我能够在init上看到弹出窗口,但在locationUpdated上没有对话框,这让我相信我的设备从未启动过它

我正在测试的设备是一台安卓5.0.1(棒棒糖)的三星S4。

这是我编写的测试应用程序,它与我的实际应用程序非常相似。

bglocation.java

package com.bglocation;

import java.util.List;
import com.codename1.io.Storage;
import com.codename1.location.LocationManager;
import com.codename1.ui.Display;
import com.codename1.ui.Form;
import com.codename1.ui.Label;
import com.codename1.ui.plaf.UIManager;
import com.codename1.ui.util.Resources;
/**
 * This file was generated by <a href="https://www.codenameone.com/">Codename One</a> for the purpose 
 * of building native mobile applications using Java.
 */
public class bglocation {
    private Form current;
    private Resources theme;
    public void init(Object context) {
        theme = UIManager.initFirstTheme("/theme");
    }
    public void start() {
        if(current != null){
            current.show();
            return;
        }
        Form hi = new Form("Hi World");

        LocationManager.getLocationManager().setBackgroundLocationListener(BackgroundLocationListener.class);
        String lastCheckin = (String)Storage.getInstance().readObject("LOCATION");
        String label = "No checkins.";
        if (lastCheckin != null) {
            label = lastCheckin;
        }
        Label hiLabel = new Label("Last checkin: " + label);
        hi.addComponent(hiLabel);
        hi.show();
    }
    public void stop() {
        current = Display.getInstance().getCurrent();
    }
    public void destroy() {
    }
}

BackgroundLocationListener.java

package com.bglocation;
import java.util.Date;
import com.codename1.io.Storage;
import com.codename1.location.Location;
import com.codename1.location.LocationListener;
public class BackgroundLocationListener implements LocationListener {
    @Override
    public void locationUpdated(Location location) {
        Storage.getInstance().writeObject("LOCATION", new Date().toString());
    }
    @Override
    public void providerStateChanged(int newState) { }
}

一旦发生重大位置更改,就会调用后台侦听器,它也在一个完全不同的进程上运行,因此您实际上没有UI或对应用程序实例的访问权限。你需要做的是启动本地通知或启动意向,或将位置存储到文件或数据库中,一旦你的应用程序启动,就可以从中获取数据。

最新更新