2017-05-29 1 views
-1

Je développe une application de suivi dans Android.Android: IntentService s'arrête soudainement

Alors que je l'ai testé l'application que je trouve un problème:

J'utilise AlarmManager pour démarrer une WakefulBroadcast qui appelle une IntentService, dans la méthode OnHandleIntent J'appelle requestLocationUpdates() de FusedLocation, et à partir d'un gestionnaire/CountDownTimer à removeLocationUpdates

Le problème est que parfois le service s'arrête soudainement, sans avertissement ni explication.

Et le journal cesse de montrer le travail de locationUpdate ou CountDownTimer exécuté

que quelqu'un peut me aider à savoir pourquoi mon IntentService est soudainement arrêter? ou existe-t-il un autre moyen de maintenir le service en cours d'exécution/en vie lors de la réception de locationUpdates?

ServiceManager:

public void StartExecuteSubscriptionService(long nextTimeMillis){ 
    Intent intent = new Intent(contextWeakReference.get(),ExecSubscriptionWakefulBroadcast.class); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(contextWeakReference.get(), 
      Constants.EXEC_SUBSCRIPTIONS_SERVICE_REQUESTCODE, 
      intent, 0); 


    final int SDK_INT = Build.VERSION.SDK_INT; 
    AlarmManager am = (AlarmManager) contextWeakReference.get().getSystemService(Context.ALARM_SERVICE); 

    if (SDK_INT < Build.VERSION_CODES.KITKAT) { 
     am.set(AlarmManager.RTC_WAKEUP, nextTimeInmillis, pendingIntent); 
    } 
    else if (Build.VERSION_CODES.KITKAT <= SDK_INT && SDK_INT < Build.VERSION_CODES.M) { 
     am.setExact(AlarmManager.RTC_WAKEUP, nextTimeInmillis, pendingIntent); 
    } 
    else if (SDK_INT >= Build.VERSION_CODES.M) { 
     am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, nextTimeInmillis, pendingIntent); 
    } 

} 

WakefulBroadcast:

public class ExecSubscriptionWakefulBroadcast extends WakefulBroadcastReceiver { 
@Override 
public void onReceive(Context context, Intent intent) { 
    Intent service = new Intent(context, ExecSubscriptionsService.class); 
    // Start the service, keeping the device awake while it is launching. 
    CatchExceptionsUtils.saveException(context,new Exception("Ejecutando ExecSubscriptionWakefulBroadcast "+ TelephonyUtils.getSystemDate("yyyy-MM-dd HH:mm:ss"))); 
    startWakefulService(context, service); 
} 

}

ExecSuscriptionService:

@Override 
protected void onHandleIntent(@Nullable Intent intent) { 

    CatchExceptionsUtils.saveException(this,new Exception("Ejecutando ExecSubscriptionService "+TelephonyUtils.getSystemDate("yyyy-MM-dd HH:mm:ss"))); 

     try{ 
      LocationUpdateRequester locationUpdateRequester = new LocationUpdateRequester(this.getApplicationContext(),intent); 
      locationUpdateRequester.requestLocationUpdates(); 
     }catch (Exception e){ 
      CatchExceptionsUtils.saveException(this,e); 
     } 
} 

LocationUpdateRequester:

public void requestLocationUpdates() throws SecurityException { 
    try{ 
     googleApiClient.connect(); 
    }catch (Exception e){ 
     CatchExceptionsUtils.saveException(contextWeakReference.get(),e); 
    } 
} 

@Override 
public void onConnected(@Nullable Bundle bundle) throws SecurityException { 
    try{ 
     CatchExceptionsUtils.saveException(contextWeakReference.get(),new Exception("Conectado a GoogleServices "+TelephonyUtils.getSystemDate("yyyy-MM-dd HH:mm:ss"))); 


     CatchExceptionsUtils.saveException(contextWeakReference.get(),new Exception("Iniciando la busqueda "+TelephonyUtils.getSystemDate("yyyy-MM-dd HH:mm:ss"))); 
    LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, TelephonyUtils.createLocationRequest(),listener); 

     countDownTimer = new CountDownTimer(Constants.TIMEOUT_GPS,20000) { 
      @Override 
      public void onTick(long millisUntilFinished) { CatchExceptionsUtils.saveException(contextWeakReference.get(),new Exception("Servicio "+ejecucionId+" encendido y ejecutando")); 
      } 

      @Override 
      public void onFinish() { 
       CatchExceptionsUtils.saveException(contextWeakReference.get(),new Exception("Ejecutando CountDown "+TelephonyUtils.getSystemDate("yyyy-MM-dd HH:mm:ss"))); 
       LocationServices.FusedLocationApi.removeLocationUpdates(googleApiClient,listener); 
       googleApiClient.disconnect(); 
       releaseWake(); 

      } 
     }.start();   

    }catch (Exception e){ 
     CatchExceptionsUtils.saveException(contextWeakReference.get(),e); 
     releaseWake(); 
    } 
} 

Listener:

LocationListener listener = new LocationListener() { 

    @Override 
    public void onLocationChanged(Location location) { 
     if(location!=null){ 
      CatchExceptionsUtils.saveException(contextWeakReference.get(),new Exception("Guardando registro; " +location.getAccuracy()+" "+location.getLatitude()+" "+location.getLongitude()+" "+TelephonyUtils.getSystemDate("yyyy/MM/dd HH:mm:ss")+" "+ejecucionId)); 

      locationList.add(location); 
     } 
    } 
}; 

18 Ejecutando ExecSubscriptionWakefulBroadcast 29.05.2017 15:11:14 29/05/2017 15: 11: 13,000

18 Ejecutando ExecSubscriptionService 2017 -05-29 15:11:15 2017-05-29 15: 11: 13.000

18 Próxima suscripcion inicia en: 0 minutes 2017-05-29 15: 11: 14.000

18 Conectando un GoogleServices 29.05.2017 15:11:15 29/05/2017 15: 11: 14,000

18 Conectado un GoogleServices 2017-05-29 15:11:15 2017-05- 29 15: 11: 14,000

18 Iniciando la busqueda 29.05.2017 15:11:16 29/05/2017 15: 11: 14,000

18 Busqueda iniciada 29/05/2017 15:11: 16 2017-05-29 15: 11: 14.000

18 Servicio 1496088675756 encendido y ejecutando 2017-05-29 15: 11: 14.000

18 Guardando registro; 2017/05/29 15:11:17 1496088675756 2017-05-29 15: 11: 15.000

18 Guardando registro; 2017/05/29 15:11:32 1496088675756 2017-05-29 15:11:31.000

18 Servicio 1496088675756 encendido y ejecutando 29/05/2017 15: 11: 34,000

18 Ejecutando ExecSubscriptionService 2017-05-29 15:26:17 2017-05-29 15:26: 16,000


Répondre

2

Ce n'est pas une utilisation appropriée de IntentService. Une fois que onHandleIntent() se termine, votre IntentService est détruit. Votre processus peut être résilié à tout moment par la suite.

Remplacez le IntentService par un Service normal, en commençant votre travail en onStartCommand(). Appelez stopSelf() lorsque vous avez terminé avec le service.

+0

Cela a fonctionné comme un charme. Merci beaucoup. Je pensais que le gestionnaire ferait l'affaire de garder le "one shot", j'ai changé mon IntentService à un service et cela a fonctionné parfaitement: D –