2011-08-08 4 views
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을 더 큰 값으로 변경해야한다는 것을 알고 있습니다. 현재로서는, 나는 단지 그것이 작동하도록 할 수 있는지 알고 싶다.

미리 감사드립니다.

+1

를 -'에 Thread.sleep()'생산 코드에 심각한 코드 냄새가 . 다른 모델에 대한 내 'LocationPoller'를보십시오 : https://github.com/commonsguy/cwac-locpoll – CommonsWare

+0

IntentService가 LocationManager의 기능을 억제합니까? 나는이 문제에 대해 아무것도 읽지 않았다. javadoc 페이지가 그것을 언급하지 않을 수도 있습니다.) –

+0

onLocationUpdate()가 호출되어야하는 스레드를 차단하고 있다고 생각합니다. – CommonsWare

답변

2

죄송합니다. 스레드를 다시 시작하십시오.

단지 일반 서비스를 사용할 수 없습니다 이유 : 당신이 그것을 싸우고 나는이`IntentService`를 사용하지 않을

public class MyService extends Service { 

    private static final String TAG = "MyService"; 
    private LocationManager lm; // somewhere initialized 
    private LocationListener ll; // somewhere initialized 


    @Override 
    public void onCreate() { 
    super.onCreate(); 
    lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, ll,Looper.getMainLooper()); 
    } 

    @Override 
    public void onDestroy() { 
    lm.removeUpdates(ll); 
    super.onDestroy(); 
    } 
} 
관련 문제