2013-05-14 2 views
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, чтобы перезапустить службу в фоновом режиме.

Даже с этими защитами у меня все еще есть проблемы, иногда приложение больше не обновляет местоположение, даже если ясно, что служба все еще работает. В приложении «Карты Google» я вижу, что местоположение там правильно, но не в моем приложении. Как это может быть, почему я больше не получаю событие onLocationChanged.

Благодарим за помощь.

ответ

2

Во-первых, я не уверен насчет Service жизненного цикла. Но я использовал код ниже в onStart() методе 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.

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 

    } 
} 

Так я и сделал.

+0

Это сервис. – nickik

+0

обновил мой ответ. проверьте это. – slhddn

+0

Зачем мне проходить через android.os.Message? Я мог бы просто делать то, что я делаю непосредственно в LocationListener. – nickik

Смежные вопросы