应用程序在后台时的ConnectionRequest

时间:2017-08-30 05:40:33

标签: codenameone

我已经通过cn1测试了Geofence示例,它设置了本地通知。当应用程序关闭(被销毁)时,它仍会发出通知。但我希望通过GPS获取位置并运行connectionRequest将它们保存在服务器中。我在以下代码中替换了connectionRequest代码而不是LocalNotification,但它不起作用。应用程序关闭时(不是当它被最小化但被销毁时)我应该怎么做才能运行connectionRequest,以便一旦用户安装并关闭(销毁)它,应用程序将他/她的位置数据永久地发送到服务器中直到应用程序已卸载。

Geofence gf = new Geofence(“test”,loc,100,100000); LocationManager.getLocationManager()。addGeoFencing(GeofenceListenerImpl.class,gf);

使用localNotification进行地理围栏:

public class GeofenceListenerImpl implements GeofenceListener {
    @Override
    public void onExit(String id) {
    }

    @Override
    public void onEntered(String id) {
        if(Display.getInstance().isMinimized()) {
            Display.getInstance().callSerially(() -> {
                Dialog.show("Welcome", "Thanks for arriving", "OK", null);
            });
        } else {
            LocalNotification ln = new LocalNotification();
            ln.setId("LnMessage");
            ln.setAlertTitle("Welcome");
            ln.setAlertBody("Thanks for arriving!");
            Display.getInstance().scheduleLocalNotification(ln, 10, LocalNotification.REPEAT_NONE);
        }
    }    
}

为什么以下不起作用? (它仅在应用程序运行或最小化时才起作用,但在销毁时不起作用。)

public class GeofenceListenerImpl implements GeofenceListener {
    @Override
    public void onExit(String id) {
       System.out.println("geofence onExit");
    }

    @Override
    public void onEntered(String id) {
        if(Display.getInstance().isMinimized()) {
            Display.getInstance().callSerially(() -> {
                System.out.println("geofence isMinimized");
            });
        } else {
            System.out.println("geofence when app is closed");
            //I want to run connectionRequest here but is not working
        }
    }    
}

PS。我使用了后台提取功能,但只有在应用程序最小化时才能使用。

Update1:​​演示如何在minimize()方法之外使用connectionRequest ...

public class GeofenceListenerImpl implements GeofenceListener {
    @Override
    public void onExit(String id) {
       System.out.println("geofence onExit");
    }

    @Override
    public void onEntered(String id) {
        if(Display.getInstance().isMinimized()) {
            Display.getInstance().callSerially(() -> {
            });
        } else {
            System.out.println("geofence when app is closed");
            Connection c = new Connection();
            c.liveTrackConnectionMethod("22" , "23");
        }
    }    
}

连接类

public class Connection {

    ArrayList<Map<String, Object>> response;
    public void liveTrackConnectionMethod(String lat, String lon) {

        ConnectionRequest cr = new ConnectionRequest() {

            @Override
            protected void readResponse(InputStream input) throws IOException {
                JSONParser jSONParser = new JSONParser();
                Map parser = jSONParser.parseJSON(new InputStreamReader(input));
                response = null;
            }
        };
        cr.setPost(true);
        cr.setUrl("http://url.com");
        cr.addArgument("userid", Preferences.get(AllUrls.userIdPreference, null));
        cr.addArgument("lat", lat + "");
        cr.addArgument("long", lon + "");
        cr.addRequestHeader("Accept", "application/json");
        NetworkManager.getInstance().addToQueueAndWait(cr);
    }
}

1 个答案:

答案 0 :(得分:1)

我认为当应用关闭或最小化时(即当前未在前台运行),应用将始终为false返回isMinimized()我可能错了。

尝试在connectionRequest之外调用isMinimized()脚本。毕竟,无论是否使用该应用,您都需要跟踪用户位置。

使用LocalNotification的第一个解决方案会在用户使用该应用时调用else部分而不是Dialog向用户显示通知,因为{{1}将是isMinimized()