2
IntentService에서 LocationManager를 사용하는 데 문제가 있습니다. 지도 이미지를 표시하는 응용 프로그램을 개발 중입니다. IntentService가 백그라운드를 실행하여 위치 변경을 감지하도록합니다. 위치 업데이트가 감지되면 서비스는 새 위치를 SQLite 데이터베이스에 기록합니다. IntentService는 브로드 캐스트를 주 활동으로 보내어 새 위치가 저장되었음을 알립니다. 기본 응용 프로그램은 데이터베이스의 위치를 추출하고 아이콘을지도의 새 위치로 이동합니다.IntentService에서 LocationManager를 사용하면 작동하지 않는 것 같습니다.
import java.util.List;
import java.io.*;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.IntentService;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
import android.location.GpsStatus;
import android.location.Location;
import android.location.LocationListener;
import android.location.GpsStatus.NmeaListener;
import android.location.LocationManager;
import android.database.*;
import android.util.Log;
// local imports
import com.saic.MCAppActivity;
import com.saic.db.*;
public class SaService extends IntentService {
private static final String tag = "SaService";
private Location loc = null;
private Intent updateMapIntent = null;
private LocationManager locMgr = null;
private boolean gps_provider = false;
private boolean net_provider = false;
public SaService()
{
super(tag);
}
public SaService(String name)
{
super(name);
}
@Override
protected void onHandleIntent(Intent intent)
{
updateMapIntent = new Intent();
updateMapIntent.setAction("UPDATE_LOCATION");
locMgr = MCAppActivity.getLocationManager();
locMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 60, 0,
locationListener);
locMgr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 60, 0,
locationListener);
// loop until told to quit
while (!MCAppActivity.toQuit())
{
try {
Thread.sleep(30000);
}
catch (InterruptedException e) {}
getBaseContext().sendBroadcast(updateMapIntent);
}
stopSelf();
}
LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
double lat = 0.0;
double lon = 0.0;
// Called when a new location is found by the network location provider.
if (location.getProvider().equals(LocationManager.GPS_PROVIDER))
{
lat = location.getLatitude();
lon = location.getLongitude();
Log.i(tag, "LocationListener(): gps_provider location update:\nlat: " + lat +
"\nlon: " + lon);
writeLocationToDB(location);
}
else if (location.getProvider().equals(LocationManager.NETWORK_PROVIDER))
{
lat = location.getLatitude();
lon = location.getLongitude();
Log.i(tag, "LocationListener(): net_provider location update:\nlat: " + lat +
"\nlon: " + lon);
writeLocationToDB(location);
}
else
{
Log.i(tag, "LocationListener(): unknown provider found");
}
}
// don't need them now. make them NO-OP
public void onStatusChanged (String provider, int status, Bundle extras) {}
public void onProviderEnabled (String provider)
{
Log.i(tag, "enable gps: "+ provider);
}
public void onProviderDisabled (String provider)
{
Log.w(tag, "disable gps: "+ provider);
}
};
}
을 locationManager 내 MCAppActivity에 정의 된 서비스에 전달됩니다 : 여기
는 서비스에 대한 코드입니다. 휴대 전화에서 응용 프로그램을 실행할 때 오류가 발생하지 않습니다. 그러나 리스너는 호출되지 않습니다. 활동과 달리 서비스에서 LocationManager를 호출하는 데 문제가 있습니까? 배터리 소모를 막기 위해 minTime을 더 큰 값으로 변경해야한다는 것을 알고 있습니다. 현재로서는, 나는 단지 그것이 작동하도록 할 수 있는지 알고 싶다.미리 감사드립니다.
를 -'에 Thread.sleep()'생산 코드에 심각한 코드 냄새가 . 다른 모델에 대한 내 'LocationPoller'를보십시오 : https://github.com/commonsguy/cwac-locpoll – CommonsWare
IntentService가 LocationManager의 기능을 억제합니까? 나는이 문제에 대해 아무것도 읽지 않았다. javadoc 페이지가 그것을 언급하지 않을 수도 있습니다.) –
onLocationUpdate()가 호출되어야하는 스레드를 차단하고 있다고 생각합니다. – CommonsWare