Android Start_redeliver_intent tarda mucho tiempo (horas) en reiniciar el servicio

Actualmente estoy realizando una aplicación que realiza sondeos de datos GPS y carga en un servidor. El servicio se inicia cuando la aplicación está en primer plano y sigue funcionando cuando la aplicación entra en segundo plano. Cuando se ejecuta la aplicación cerca, onTaskRemoved se llama y un administrador de alarmas reinicia el servicio. El servicio es un IntentService con un AsyncTask para publicar las coordenadas de gps.

Aquí es donde ocurre la rareza. Cuanto más larga sea la aplicación en primer plano, más tiempo tardará Android en reiniciarla utilizando START_REDELIVER_INTENT como la devolución en onStartCommand. El servicio es muy rara vez asesinado por Android, pero cuando lo hace, puede tomar mucho tiempo para reiniciar en función de cuánto tiempo estaba en primer plano. (?) .. creo.

Así que para propósitos de pruebas, he eliminado el administrador de alarmas que reinicia la aplicación, así que cuando deslizo la aplicación cerrada, android se reiniciará con START_REDELIVER_INTENT. Si tengo la aplicación abierta durante 30 segundos, lo que significa que el servicio en segundo plano se está ejecutando durante 30 segundos, y luego deslizar la aplicación cerrada, Android se reiniciará en menos de un minuto.

Pero si empiezo la aplicación, que inicia el servicio en segundo plano, y dejo la aplicación en primer plano para decir 10 minutos, puede tardar más de una hora en Android para reiniciar el servicio cuando deslizo la aplicación cerrada. Durante estos 10 minutos, la aplicación está sondeando gps cada 30 segundos, y usando un AsyncTask para subir coords cada 5 minutos. No tengo ni idea de lo que está pasando. Ni siquiera estoy totalmente seguro de que está relacionado con la aplicación que está en primer plano, pero puedo replicar una y otra vez por tiempo cuánto mantener la aplicación en primer plano, que parece proporcional a cuánto tiempo lleva Android para reiniciar el servicio.

Hombre sé que esto suena loco, pero espero que no lo sea.

También como una nota lateral, estoy usando Cordova / javascript para la aplicación en sí, pero el servicio es todo Java. Aquí está mi onCreate y onStartCommand. No estoy seguro de qué más debo publicar.

@Override public void onCreate() { super.onCreate(); //Log.i(TAG, "OnCreate"); locationManager = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE); locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 60000, 0, this); registerReceiver(sendHTMLReceiver, new IntentFilter("html_alarm")); PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG); } @Override public int onStartCommand(Intent intent, int flags, int startId) { if (intent != null) { isCheckedIn = intent.getExtras().getBoolean("checkedIn"); showNotification("Courtesy Checkout Enabled"); } return START_REDELIVER_INTENT; } 

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.