Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Codenameone 代号一:背景位置监听器未在Android棒棒糖上启动_Codenameone - Fatal编程技术网

Codenameone 代号一:背景位置监听器未在Android棒棒糖上启动

Codenameone 代号一:背景位置监听器未在Android棒棒糖上启动,codenameone,Codenameone,我正在开发一个应用程序,可以定期捕获用户的位置(我每60分钟搜索一次),跟踪他们访问过的城市 我第一次开始使用前台位置监听器,它非常完美,似乎每隔几分钟就会启动一次,但我已经进行了检查,以便只有经过足够的时间,它才能真正跟踪一个位置。当我切换到其他应用程序时,前台监听器似乎会继续启动一段时间,然后停止启动,这对我来说是有意义的,因为我认为操作系统正在将应用程序后台化。在这一点上,我希望后台侦听器已经注册,并在启动该侦听器时唤醒应用程序 关于我的问题。。。背景位置侦听器有问题。我知道它不会在模拟器

我正在开发一个应用程序,可以定期捕获用户的位置(我每60分钟搜索一次),跟踪他们访问过的城市

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

关于我的问题。。。背景位置侦听器有问题。我知道它不会在模拟器上启动,但在我为设备构建调试(使用内置证书)时也不会启动。为了回答这个问题,我根据下面列出的示例,将我的应用程序做的事情归纳为基本内容:

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

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

我正在测试的设备是三星S4,搭载安卓5.0.1(棒棒糖)

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

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() {
    }
}

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

您能否定义重要的位置更改?另外,我可以在哪里存储我收到的数据有任何限制吗?我打算使用Storage类在为我的应用程序存储文件的任何位置的根目录下写入文件,因此我假设侦听器和我的应用程序都可以访问它。在Android上,后台请求定义为10秒间隔和50米更改,在iOS上,它被映射到重要的位置更改回调,这意味着当设备检测到设备相关单元的更改时,towerI在原始帖子中更新了我的示例,以便侦听器现在只向存储写入,在start()(每次应用程序取消挂起时调用)中,我从同一位置读取,但它仍然不起作用,你能帮忙吗?我创建了一个新版本并将其推送到我的设备上,我确保该应用程序一整天都没有停止(通过按住home按钮显示正在运行的应用程序进行验证)。我今天打开了三次应用程序:在我上班之前,在工作地点(~15公里外),然后在我回家时,即使我强制退出/重新打开,标签也没有更新。嗨@Chen,如果有任何帮助,我都会非常感激,我完全不明白为什么它不工作。结果是框架中的一个错误是由旧的Android错误引起的()这是问题的根源。自那以后,陈将更改添加到CN1框架中,一切都按照预期进行。
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) { }
}