¿Cómo reiniciar automáticamente un servicio incluso si la fuerza del usuario lo cierra?

Quiero que un servicio funcione todo el tiempo en mi aplicación. Así que quiero reiniciarlo, incluso si es la fuerza cerrada por el usuario. Definitivamente hay una manera de hacerlo como aplicaciones como facebook lo están haciendo. (No se hace usando la notificación push, facebook reinicia su servicio incluso si Internet está apagado).

Cualquier ayuda sería apreciada. ¡Gracias!

10 Solutions collect form web for “¿Cómo reiniciar automáticamente un servicio incluso si la fuerza del usuario lo cierra?”

En primer lugar, es realmente muy malo patrón para ejecutar el servicio con fuerza contra la voluntad del usuario .

De todos modos, puede reiniciarlo usando un BroadcastReceiver que maneja la emisión enviada desde onDestroy() de su servicio.

StickyService.java

 public class StickyService extends Service { private static final String TAG = "StickyService"; @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.e(TAG, "onStartCommand"); return START_STICKY; } @Override public void onDestroy() { super.onDestroy(); sendBroadcast(new Intent("YouWillNeverKillMe")); } } 

RestartServiceReceiver.java

 public class RestartServiceReceiver extends BroadcastReceiver { private static final String TAG = "RestartServiceReceiver"; @Override public void onReceive(Context context, Intent intent) { Log.e(TAG, "onReceive"); context.startService(new Intent(context.getApplicationContext(), StickyService.class)); } } 

Declarar los componentes en el archivo de manifiesto :

  <service android:name=".StickyService" > </service> <receiver android:name=".RestartServiceReceiver" > <intent-filter> <action android:name="YouWillNeverKillMe" > </action> </intent-filter> </receiver> 

Inicie el StickyService en un componente (es decir, Application , Activity , Fragment ):

 startService(new Intent(this, StickyService.class)); 

O

 sendBroadcast(new Intent("YouWillNeverKillMe")); 

Siempre que un servicio es asesinado, su método onDestroy siempre se llama. Su mejor utilizar un BroadcastReceiver para comenzar su servicio cuando está matado.

He aquí un ejemplo de código que ilustra su implementación:

 @Override public void onDestroy() { Intent in = new Intent(); in.setAction("StartkilledService"); sendBroadcast(in); Log.d("debug", "Service Killed"); } 

Luego registre un receptor en AndroidManifest.xml : –

 <receiver android:name=".app.ServiceDestroyReceiver" > <intent-filter> <action android:name="StartKilledService" > </action> </intent-filter> </receiver> 

Por último, cree un BroadcastReceiver e inicie su servicio en el método onReceive :

 @Override public void onReceive(Context context, Intent intent) { Log.d("debug", "ServeiceDestroy onReceive..."); Log.d("debug", "action:" + intent.getAction()); Log.d("debug", "Starting Service"); ServiceManager.startService(); } 

Espero que esto ayude.

Usted tiene que crear un sticky service con el método onTaskRemoved sobrescribe, donde usted puede fijar un servicio de la alarma para accionar su código otra vez.

 public class BackgroundService extends Service { @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { return START_STICKY; } @Override public void onTaskRemoved(Intent rootIntent) { //create a intent that you want to start again.. Intent intent = new Intent(getApplicationContext(), BackgroundService.class); PendingIntent pendingIntent = PendingIntent.getService(this, 1, intent, PendingIntent.FLAG_ONE_SHOT); AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); alarmManager.set(AlarmManager.RTC_WAKEUP, SystemClock.elapsedRealtime() + 5000, pendingIntent); super.onTaskRemoved(rootIntent); } } 

También en algunos dispositivos como Xiaomi, Huwaei la aplicación obtiene la fuerza cerrada una vez su eliminado de las aplicaciones recientes. Esto se debe a que los fabricantes tienen funciones de administrador de tareas que lo hace para mejorar el rendimiento de la memoria RAM / batería.

Puede consultar este enlace para obtener más información: https://stackoverflow.com/a/41360159/2798289

Según el documento de Android

 Starting from Android 3.1, the system's package manager keeps track of applications that are in a stopped state and provides a means of controlling their launch from background processes and other applications. Note that an application's stopped state is not the same as an Activity's stopped state. The system manages those two stopped states separately. FLAG_INCLUDE_STOPPED_PACKAGES — Include intent filters of stopped applications in the list of potential targets to resolve against. FLAG_EXCLUDE_STOPPED_PACKAGES — Exclude intent filters of stopped applications from the list of potential targets. When neither or both of these flags is defined in an intent, the default behavior is to include filters of stopped applications in the list of potential targets. Note that the system adds FLAG_EXCLUDE_STOPPED_PACKAGES to all broadcast intents. It does this to prevent broadcasts from background services from inadvertently or unnecessarily launching components of stopped applications. A background service or application can override this behavior by adding the FLAG_INCLUDE_STOPPED_PACKAGES flag to broadcast intents that should be allowed to activate stopped applications. 

En la parada de Fuerza de la aplicación, Android acaba de matar el ID del proceso. Ninguna advertencia, callbacks se da a servicio / actividades. Según el documento de Android, cuando se cancela la aplicación hay posibilidades de que se llame onPause ().

Cuando lo intenté en mi aplicación, incluso onPause () no se llamó. Creo que la única manera es utilizar FLAG_INCLUDE_STOPPED_PACKAGES bandera de intención y enviarlo desde otra aplicación

Si entiendo correctamente, entonces en realidad esto no es posible, la característica de Android para forzar la aplicación de cierre fue diseñado para permitir al usuario deshacerse de las aplicaciones no deseadas, por lo que no permite ninguna actividad desde que el usuario vuelva a iniciar cualquiera de sus actividades.

Reinicie el servicio incluso si la aplicación se detiene con la fuerza y ​​Sigue ejecutando el servicio en segundo plano incluso después de cerrar la aplicación ¿Cómo?

Si la situación permite usar "raíz" es posible implementar el paradigma Humpty-Dumpty.

Su aplicación (1ª) instala otra aplicación (2ª, extrae APK de los activos) y ejecuta el servicio de la segunda aplicación. El servicio de la segunda aplicación se enlaza al primer servicio de aplicaciones y vuelve a conectarse cuando se desconecta. La primera aplicación hace lo mismo.

Seguro que no ayudará cuando todas las aplicaciones son asesinados por algunos RAM libre o una aplicación similar, pero cuando Android mata cualquiera de los dos, el otro reiniciará su contraparte.

En la devolución del método startCommand del servicio START_STICKY. Generalmente le dice al sistema operativo que inicie el servicio cuando se lo mata.

Hay una solución muy hacky para mantener el servicio funcionando incluso que la fuerza de detenerlo. No recomiendo eso porque es contra la disposición del usuario. Puede definir un receptor de difusión para recibir la intención con la acción X. onStartCommand manejador de su servicio, difusión X (si el servicio no se inicia todavía). En el receptor de la difusión sobre la recepción de X, primero comienza el servicio, entonces, duerme por algunos minutos, y finalmente re-broadcast X.

Creo que la única solución infalible aquí es tener dos servicios en procesos separados ( android:process="somecustomprocessname" en manifesto, en la entrada de servicio) que escuchan las emisiones y se reinician entre sí, porque actualmente la interfaz de usuario no permite a los usuarios Matar múltiples procesos en una acción. A continuación, puede configurar un hilo de pinger en cada servicio que comprueba si el otro servicio se está ejecutando cada 100 milisegundos aproximadamente, y si no, intenta reiniciarlo. Pero esto está empezando a parecerse cada vez más al malware …

La única solución real para mantener los servicios vivos es llamar a Service.startForeground(...) con una notificación proporcionada. Esta será la única solución válida, cada una será muy dependiente de cómo Google cambiará el comportamiento de su sistema. Con cada actualización de la API, Google podría evitar cada otro hack.

Esto también mantiene al usuario consciente, que su aplicación está realizando alguna tarea de fondo que mantendrá la aplicación viva y el usuario tiene que detener esto. Sin embargo, si proporciona al usuario la posibilidad de detenerlo, es parte de su aplicación.

Vea la Documentación:

 void startForeground (int id, Notification notification) 

Haga que este servicio se ejecute en primer plano, proporcionando la notificación en curso que se mostrará al usuario mientras se encuentre en este estado. Por defecto los servicios son de fondo, lo que significa que si el sistema necesita matarlos para recuperar más memoria (por ejemplo, para mostrar una página grande en un navegador web), se pueden matar sin demasiado daño. Puede establecer esta bandera si matar su servicio sería perjudicial para el usuario, como si su servicio está realizando reproducción de música de fondo, por lo que el usuario se daría cuenta si su música dejó de jugar.

  • OnServiceConnected nunca llamado después del método bindService
  • Android: superposición en la ventana sobre las actividades de una tarea
  • Eventos de apagado en Android
  • ¿Hay alguna manera de obtener actualizaciones de fondo de la API de Google Fit?
  • Temporizador La tarea deja de ejecutarse después de un tiempo indefinido en android
  • Una forma más eficiente de actualizar la interfaz de usuario del servicio que las intenciones?
  • Enviar correo electrónico en servicio (sin preguntar al usuario)
  • BadParcelableException: ClaseNotFoundException al unmarshalling
  • Vinculante para ejecutar el servicio (después de finish ()) / callback Handler
  • Iniciar servicio desde la notificación
  • Temporizador de cuenta atrás Android en segundo plano
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.