Android: mantener el servicio en ejecución cuando se mata la aplicación
Quiero mantener un IntentService
ejecutándose en segundo plano incluso cuando se IntentService
la aplicación. Y por "matado" me refiero a pulsar el botón de inicio durante mucho tiempo -> ver todas las aplicaciones en ejecución -> deslizar mi app a un lado -> aplicación matada O pulsar el botón de nuevo durante mucho tiempo -> app matado
Mi código es el siguiente. En mi MainActivity:
- ¿Puede Android ServiceTestCase <MyService> enviar mensajes a mi servicio?
- Detener el servicio de fondo Cuando la aplicación va al fondo
- Iniciar servicio desde la notificación
- ¿Cuál es la forma correcta de detener un servicio que se está ejecutando como primer plano
- MVC en Android: ¿Aplicación o servicio para actualizaciones asíncronas?
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 está en ejecución cuando cierro la aplicación mediante el botón Atrás. Pero se detendrá si lo mato como se mencionó anteriormente. ¿Cómo puedo solucionar esto?
- Cómo ensayar un servicio de Android que depende de una conexión de red
- Actividad de Android sin GUI
- Android startService () tarda mucho tiempo en volver al subproceso de interfaz de usuario
- Adquisición de instancia del servicio de fondo
- El servicio de Android solo se inicia en modo de depuración
- Icono de servicio persistente en la barra de notificaciones
- Obtener ubicación GPS a través de un servicio en Android
- GCM de Android SERVICE_NOT_AVAILABLE
Si su servicio es iniciado por su aplicación, en realidad su servicio se ejecuta en el proceso principal. Así que cuando se cancela la aplicación, el servicio también se detendrá. Así que lo que usted puede hacer es, envíe la transmisión de onTaskRemoved
método de su servicio como sigue:
Intent intent = new Intent("com.android.ServiceStopped"); sendBroadcast(intent);
Y tienen un receptor de difusión que volverá a iniciar un servicio. Lo he probado. El servicio se reinicia de todo tipo de muertes.
Dentro del comando onstart poner START_STICKY
… Este servicio no matará a menos que esté haciendo demasiada tarea y el kernel quiere 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 usted está intentando utilizar un IntentService. Esta es la línea de los Documentos de la API
El IntentService hace lo siguiente:
Detiene el servicio después de que todas las solicitudes de inicio se han manejado, por lo que nunca tendrá que llamar a stopSelf ().
Por lo tanto, si desea que su servicio se ejecute indefinidamente le sugiero extender la clase de servicio en su lugar. Sin embargo, esto no garantiza que su servicio funcione indefinidamente. Su servicio todavía tendrá la posibilidad de ser asesinado por el kernel en un estado de baja memoria si es de baja prioridad. Así que tiene dos opciones:
1) Manténgalo funcionando en primer plano llamando al método startForeground()
.
2) Reinicie el servicio si se mata. Aquí está una parte del ejemplo de los documentos donde hablan de reiniciar el servicio después de que se mate
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; }