2014-02-22 47 views
1

我遇到了一些麻煩,試圖阻止我之前在Android應用程序類的擴展類的onCreate()上開始的服務。 GPS應該在應用程序執行期間運行(該部分工作正常),但是當應用程序關閉時,服務仍在運行。我嘗試使用onTerminate(),因爲applicationaction類中不存在onClose(),並且服務繼續運行。停止擴展應用程序類的Android服務

public class ControlEntrega extends Application { 

    public GPSBean posicion; 
    public ServicioGPS servicio; 

    public void onCreate() { 
     Log.d(TAG,"onCreate"); 
     super.onCreate(); 
     usuario=null; 
     cliente=null; 
     entrega=null; 
     dal=new DAL(getApplicationContext()); 
     crearDB(); 
     util=new Utilitario(); 
     servicio=new ServicioGPS(); 
     posicion=new GPSBean(); 
     iniciarGPS(); 
    } 

    @Override 
    public void onTerminate() { 
     super.onTerminate(); 
     Log.d(TAG,"onTerminate"); 
     try { 
      stopService(new Intent(this,ServicioGPS.class)); 
     } catch (Exception e) { 
      Log.d(TAG,"onTerminate error: "+e.getMessage()); 
     } 


    } 
} 

服務類:

公共類ServicioGPS擴展服務實現LocationListener的{

String TAG=ServicioGPS.class.getCanonicalName(); 
LocationManager locationManager=null; 
public int tiempoGPS=1; 
public int distanciaMetros=10; 
Intent notificacion; 
ControlEntrega controlador; 

@Override 
public IBinder onBind(Intent intent) { 

    return null; 
} 

@Override 
public void onDestroy() { 

    super.onDestroy(); 
    Log.d(TAG,"onDestroy"); 
    locationManager = (LocationManager)getSystemService(LOCATION_SERVICE); 
    locationManager.removeUpdates(this); 

} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 

    Log.d(TAG, "onStartCommand"); 

    controlador= (ControlEntrega)getApplicationContext(); 
    if(controlador!=null){ 
     if(controlador.posicion!=null){ 
      controlador.posicion.imprimir(); 
     } 
    } 
    locationManager =(LocationManager)getSystemService(LOCATION_SERVICE); 
    Criteria criteria = new Criteria(); 
    String provider = locationManager.getBestProvider(criteria,true); 

    //LocationManager.GPS_PROVIDER 
    //LocationManager.NETWORK_PROVIDER 
    locationManager.requestLocationUpdates(provider,1000 * 60 * tiempoGPS,distanciaMetros,this); 

    return super.onStartCommand(intent, flags, startId); 
} 


@Override 
public void onLocationChanged(Location location) { 

    Log.d(TAG, "onLocationChanged"); 

    //Seteando los valores del objeto location 
    if(controlador!=null){ 
     Log.d(TAG, "seteando bean GPS"); 
     controlador.posicion=new GPSBean(); 
     controlador.posicion.latitud=location.getLatitude(); 
     controlador.posicion.longitud=location.getLongitude(); 
     controlador.posicion.altitud=location.getAltitude(); 
     controlador.posicion.precision=location.getAccuracy(); 
     controlador.posicion.proveedor=location.getProvider(); 
     controlador.posicion.tiempo=location.getTime(); 
     controlador.posicion.velocidad=location.getSpeed(); 
     controlador.posicion.imprimir(); 
    } 

    //Notificación 
    Intent notificacion = new Intent(getString(R.string.intentGPS)); 
    sendBroadcast(notificacion); 

    //Se para asi mismo, ya se calendarizo antes 
    stopSelf(); 

} 

@Override 
public void onProviderDisabled(String provider) { 


} 

@Override 
public void onProviderEnabled(String provider) { 


} 

@Override 
public void onStatusChanged(String provider, int status, Bundle extras) { 


    } 

    } 

有一種方法在應用程序完全停止我能知道嗎?所以我可以停止服務。

問候

阿爾弗雷多

+0

在不同的過程比你用來啓動服務的應用程序運行你的服務。請檢查ServicioGPS的清單聲明。 – prabhat

+0

您的終端是否被稱爲?實際上,爲了安全起見,你應該改變onPause()方法,因爲在調用onPause()之後你的進程可能被操作系統殺死。這意味着onStop()和onDestroy()可能會或可能不會被調用。 在任何情況下,都不能保證會調用onDestroy()。如果操作系統決定殺死你的進程,它不會在任何活動上調用onDestroy()。 – Skynet

+0

關於「是否知道我是否完全停止」您需要編寫一個文件並在每個活動生命週期方法中更新此文件,那麼您必須跟蹤此文件。 – Skynet

回答

0
public class EyeCastApplication extends Application { 

    static Context context; 


    @Override 
    public void onCreate() { 
     // TODO Auto-generated method stub 
     super.onCreate(); 

     context = getApplicationContext(); 

    } 

    /*** 
    * start Heart Beat Loop 
    */ 
public static void stopHeartBeatLoop() { 
     context.stopService(new Intent(context, CmdConnectService.class)); 
    } 



enter code here 

    enter code here 

}