Android: mantenga el servicio en ejecución cuando se mata la aplicación

Quiero mantener un IntentService ejecutándose en segundo plano incluso cuando se mata la aplicación. Y por “muerto” quiero decir presionar botón de inicio durante mucho tiempo -> ver todas las aplicaciones en ejecución -> deslizar mi aplicación a un lado -> aplicación eliminada O presionar botón de retroceso durante mucho tiempo -> aplicación eliminada

Mi código es el siguiente. En mi actividad principal:

 Intent intent = new Intent(this, MyService.class); this.startService(intent); 

En mi MyService:

 public class MyService extends IntentService { @Override protected void onHandleIntent(Intent intent) { System.out.println("MyService started"); run(); } private void run() { while (true){ System.out.println("MyService still running"); doSomething(); waitSomeTime(); } } } 

Veo que el servicio se está ejecutando cuando la aplicación está abierta . Todavía se está ejecutando cuando minimizo la aplicación a través del botón de inicio. Todavía se está ejecutando cuando cierro la aplicación a través del botón de retroceso. Pero se detendrá si lo mato como se mencionó anteriormente. ¿Cómo puedo solucionar esto?

Si su aplicación es iniciada por su aplicación, entonces su servicio se está ejecutando en el proceso principal. así que cuando se mata la aplicación, el servicio también se detendrá. Entonces, lo que puede hacer es enviar transmisiones desde el método de su servicio onTaskRemoved de la siguiente manera:

  Intent intent = new Intent("com.android.ServiceStopped"); sendBroadcast(intent); 

y tener un receptor de difusión que nuevamente iniciará un servicio. Lo intenté el servicio se reinicia desde todo tipo de asesinatos.

dentro del comando onstart pon START_STICKY … Este servicio no matará a menos que esté haciendo demasiada tarea y kernel quiera matarlo por ello …

 @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i("LocalService", "Received start id " + startId + ": " + intent); // We want this service to continue running until it is explicitly // stopped, so return sticky. return START_STICKY; } 

La razón de esto es que estás tratando de usar un IntentService. Aquí está la línea de los API Docs

IntentService hace lo siguiente:

Detiene el servicio después de que se hayan manejado todas las solicitudes de inicio, por lo que nunca tendrá que llamar a StopSelf ().

Por lo tanto, si desea que su servicio se ejecute indefinidamente, le sugiero que extienda la clase de servicio en su lugar. Sin embargo, esto no garantiza que su servicio se ejecutará indefinidamente. Su servicio aún tendrá la posibilidad de ser destruido por el kernel en un estado de poca memoria si es de baja prioridad. Por lo tanto, tiene dos opciones:
1) Manténgalo funcionando en primer plano llamando al método startForeground() .
2) Reinicia el servicio si se mata. Aquí hay una parte del ejemplo de los documentos en los que se habla sobre reiniciar el servicio después de matarlo.

  public int onStartCommand(Intent intent, int flags, int startId) { Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show(); // For each start request, send a message to start a job and deliver the // start ID so we know which request we're stopping when we finish the job Message msg = mServiceHandler.obtainMessage(); msg.arg1 = startId; mServiceHandler.sendMessage(msg); // If we get killed, after returning from here, restart return START_STICKY; } 

Puede usar android:stopWithTask="false" en el manifiesto como abajo, Esto significa que incluso si el usuario mata la aplicación eliminándola de la lista de tareas, su servicio no se detendrá.