0

我正在开发一个必须在后台运行并将位置更新发送到服务器的应用程序。

代码非常简单,正常工作。有一个服务有一个定时器,它每 15 秒向服务器发送一次更新,它还实现了 LocationListener 接口。

我不认为提供所有代码会有用,这是我设置课程的方式:

@Override
public void onCreate() {
    super.onCreate();

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER            , 5000, 10.0f, this);
    locationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER , 5000, 10.0f, this);

    //Ping Task sends updates to the Server
    Ping_Timer.scheduleAtFixedRate( new Ping_Task(), 5000, Ping_Task.TIME_GET_JOBS*1000 );
}

在实践中,我的代码存在一些问题。服务应该在后台工作,即使服务停止,也有一个 GCM 系统可以在后台重新启动服务。

即使有了这些保护,我仍然遇到问题,有时应用程序不再更新位置,即使很明显该服务仍在运行。在谷歌地图应用程序上,我可以看到位置正确,但在我的应用程序中不正确。这怎么可能,为什么我不再收到“onLocationChanged”事件了。

谢谢你的帮助。

4

1 回答 1

2

首先,我不确定Service生命周期。但是我onStart()Service. startService(Intent)在调用方法 on之后调用此方法Context。我想,你可以在onCreate()方法中做到这一点。

实现一个位置监听器:

private final static LocationListener listener = new LocationListener() {

    @Override
    public void onLocationChanged(Location location) {
        //locationHandler will be created below.
        Message.obtain(locationHandler, 0, location.getLatitude() + ", " + location.getLongitude()).sendToTarget();
    }

    @Override
    public void onProviderDisabled(String provider) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }
};

将您的听众改为该方法this

locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 5000, 10.0f, listener);
locationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER, 5000, 10.0f, listener);

onStart()在你的方法中为这个监听器实现一个处理程序Service

Handler locationHandler = new Handler() {
    @Override
    public void handleMessage(android.os.Message msg) {
        String location = (String) msg.obj;

        //do what you wanna do with this location

    }
}

我就是这样做的。

于 2013-05-14T12:33:26.317 回答