El sistema Android eliminó mi servicio cuando borro todas las aplicaciones recientes

Ya uso startforeground () en mi servicio, pero el sistema android sigue matando a mi servicio cuando borro todas las aplicaciones recientes. Aquí está mi código:

@Override public int onStartCommand(Intent intent, int flags, int startId) { //Here's what my service do. Notification notification = new NotificationCompat.Builder(this) .setContentTitle("Text") .setTicker("Text") .setContentText("Text") .setSmallIcon(R.drawable.icon) .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.icon)) .build(); startForeground(100, notification); return START_STICKY; } 

¿Hay algo mal que hice con este código? Gracias.

Un servicio de larga duración necesita lo siguiente para que sea menos probable que se termine:

  1. Devolver START_STICKY desde onStartCommand() . Con esto, el sistema reiniciará el servicio incluso si tiene que ser detenido por limitaciones de recursos.

  2. Cuando el servicio no está vinculado a ningún componente de interfaz de usuario (por ejemplo, una actividad), el servicio debe ir en el modo de primer plano mostrando una notificación de primer plano. Los servicios de primer plano tienen menos probabilidades de ser terminados por el sistema.

  3. Establezca el atributo "stopWithTask"=false en la correspondiente etiqueta <service> del archivo de manifiesto.

Además, tenga en cuenta que los dispositivos de algunos fabricantes finalizarán los servicios incluso con las propiedades anteriores debido a la personalización:

  1. Administradores de tareas personalizados.
  2. Funciones de ahorro de batería que pueden prohibir servicios que no son del sistema.

Algunos servicios de aplicación necesitan permanecer en segundo plano y tienen que mantenerse vivos agresivamente. Aunque este método no se recomienda, pero se pueden realizar los siguientes pasos:

  1. Agregue disparadores para el inicio del servicio: como Boot Complete y Network Connected.

  2. Si el servicio recibe intenciones / emisiones FLAG_RECEIVER_FOREGROUND en la intención.

  3. Un recurso extremo es programar manualmente una intención pendiente para reiniciar el servicio , con AlarmManager , cuando onTaskRemoved() se llama.

Ver también:

  1. START_STICKY no funciona en Android KitKat

El sistema Android puede detener su servicio en cualquier momento cuando desee detenerse para mantener el rendimiento del dispositivo o el consumo de energía. Hay muchos situación donde el sistema androide puede detener su servicio como batería baja, la aplicación no está en estado activo durante mucho tiempo, el dispositivo está en modo de dormir, modo de ahorro de energía, etc

He desarrollado un truco o hack (que se puede decir que) mediante el uso de que nadie puede detener su servicio (sistema Android, aplicaciones de terceros, el usuario).

Nota: Al usar esto, su servicio nunca se detendrá y podría drenar su batería también.

Siga los pasos a continuación: –

1) Devolver START_STICKY en onStartCommand.

2) A continuación, modifique el método onDestroy () y onTaskRemoved () en su servicio como se indica a continuación:

 @Override public void onDestroy() { super.onDestroy(); Toast.makeText(getApplicationContext(), "Service Task destroyed", Toast.LENGTH_LONG).show(); Intent myIntent = new Intent(getApplicationContext(), YourService.class); PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 0, myIntent, 0); AlarmManager alarmManager1 = (AlarmManager) getSystemService(ALARM_SERVICE); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.add(Calendar.SECOND, 10); alarmManager1.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); Toast.makeText(getApplicationContext(), "Start Alarm", Toast.LENGTH_SHORT).show(); } @Override public void onTaskRemoved(Intent rootIntent) { super.onTaskRemoved(rootIntent); Intent myIntent = new Intent(getApplicationContext(), YourService.class); PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 0, myIntent, 0); AlarmManager alarmManager1 = (AlarmManager) getSystemService(ALARM_SERVICE); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.add(Calendar.SECOND, 10); alarmManager1.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); Toast.makeText(getApplicationContext(), "Start Alarm", Toast.LENGTH_SHORT).show(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Toast.makeText(getApplicationContext(), "Service Starts", Toast.LENGTH_SHORT).show(); return START_STICKY; } 

Aquí estoy fijando una alarma cada vez que el servicio es parada (por el sistema del androide o por el usuario mannually) y usando PendindIntent reanudan el servicio en el plazo de 10 segundos cada vez.

Puede utilizar START_REDELIVER_INTENT en lugar de START_STICKY

La explicación más simple de estos podría ser,

START_STICKY- le dice al sistema que cree una copia nueva del servicio, cuando haya suficiente memoria disponible, después de que se recupere de la memoria baja. Aquí perderás los resultados que pudieron haber calculado antes.

START_NOT_STICKY- le dice al sistema que no se moleste en reiniciar el servicio, incluso si tiene suficiente memoria.

START_REDELIVER_INTENT- le indica al sistema que reinicie el servicio después del bloqueo y también redeliver las intenciones que estaban presentes en el momento del bloqueo.

Espero que esto ayude. Gracias

Por favor, lea esto Haga clic aquí

Algunos de los dispositivos que tienen Android personalizada, no una prueba real de Android va a matar a su servicio cuando se borra la aplicación reciente

  • Android: `java.lang.IllegalArgumentException: Servicio no registrado` cuando se llama onStop ()
  • El servicio Android debe ejecutarse siempre (nunca detener o detener)
  • ¿Qué significa la pérdida de una conexión de servicio?
  • Android: habilitar y servicios
  • No se puede llamar a runOnUiThread en un subproceso desde dentro de un servicio
  • Envíe la solicitud a la parte posterior y traiga a frente
  • El servidor http de Android no es accesible desde otros dispositivos de la red intermitentemente
  • ¿Cómo comprobar si SpeechRecognizer se está ejecutando actualmente?
  • ¿Cómo establecer una comunicación bidireccional entre Actividad y Servicio en diferentes procesos?
  • ActivityManager # getRunningServices devuelve el servicio que se detiene manualmente
  • Servicio de primer plano que se está matando en el clic de notificación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.