我正在开发一个必须在后台运行并将位置更新发送到服务器的应用程序。
代码很简单,也很正常。有一个服务有一个Timer,它每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'事件。
感谢您的帮助。
答案 0 :(得分:2)
首先,我不确定Service
生命周期。但我在onStart()
的{{1}}方法中使用了以下代码。在Service
上调用startService(Intent)
方法后调用此方法。我想,你可以用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
这就是我的方式。