2013-05-14 3 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() 메서드에서 사용했습니다. 이 메서드는 ContextstartService(Intent) 메서드를 호출 한 후에 호출됩니다. 제 생각에는 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); 

ServiceonStart() 방법이 청취자에 대한 처리기를 구현하는 방법에 수신기를 지정합니다.

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

관련 문제