2012-06-28 11 views
13

Me refiero a android design considerations: AsyncTask vs Service (IntentService?)IntentService se mató después de dejar mi solicitud

De acuerdo con la discusión, AsyncTask no conviene, porque es bien "obligado" a su actividad

Así , Lanzo un Thread (supongo que AsyncTask y Thread pertenecen a la misma categoría), tengo un bucle de ejecución infinito y realicé las siguientes pruebas.

  • I dejar de fumar mi solicitud, manteniendo presionando tecla de retroceso suave, hasta que vi la pantalla de inicio. El hilo todavía se está ejecutando.
  • me matan mi solicitud, yendo a Administrar aplicaciones -> Aplicación -> forzar la detención de. El hilo está detenido.

Por lo tanto, espero que después de que cambian de Thread a Service, mi Service mantendrá viva incluso después de dejar de fumar o matan mi aplicación.


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

public class SyncWithCloudService extends IntentService { 
    public SyncWithCloudService() { 
     super("SyncWithCloudService"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     int i = 0; 
     while (true) { 
      Log.i("CHEOK", "Service i is " + (i++)); 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException ex) { 
       Log.i("CHEOK", "", ex); 
      } 
     } 
    } 
} 

// Doesn't matter whether I use "android:process" or not. 
    <service 
     android:name="com.xxx.xml.SyncWithCloudService" 
     android:process=".my_process" > 
    </service> 

Sin embargo, mi conclusión es que,

  • I salí mi aplicación, al mantener presionada la tecla suave Atrás, hasta que vi la pantalla de inicio. El servicio aún se está ejecutando.
  • me matan mi solicitud, yendo a Administrar aplicaciones -> Aplicación -> forzar la detención de. El servicio está detenido.

Parece que el comportamiento de Service y Thread es el mismo. Entonces, ¿por qué debería usar Service en lugar de Thread? ¿Hay algo que me haya perdido? Pensé que mi Service supongo que seguiría funcionando, incluso después de matar a mi aplicación.

Respuesta

10

Nope. El servicio dejará de funcionar cuando mate su aplicación. Cuando matas tu aplicación, todos sus componentes mueren (actividades, servicios, etc.).

En general, el comportamiento de Thread and Service es similar.Sin embargo, si inicia un Tema desde una Actividad y luego cierra la actividad (es decir, abandona su aplicación), eventualmente Android notará que su proceso no tiene componentes activos (ya que Android no reconoce su Tema como un componente activo) y matará tu proceso, matando el hilo.

Sin embargo, si tiene un servicio en ejecución, entonces Android notará que tiene un servicio en ejecución y no lo eliminará tan fácilmente. Sin embargo, todavía es posible que Android mate su proceso de servicio si no está "en uso".

+2

Pero mi prueba es que, cuando deje mi solicitud (presionando la tecla suave varias veces hasta llegar a la pantalla de inicio), el hilo aún se está ejecutando. ¿Es porque, tengo la suerte de que el sistema operativo no mata mi hilo? –

+2

Sí, el hilo se ejecutará durante un período de tiempo hasta que Android decida matar el proceso. No lo hace de inmediato, solo lo hace si y cuando se siente así. No tienes control sobre cuándo se matará el proceso. –

+0

OK. Gracias. Voy a probar para ejecutarlo durante varias horas y ver cómo funciona. Para el servicio, ¿la "garantía" de Android no la está matando? Como tengo un bucle de infinito corriendo dentro de él (para probar). –

1

Está usted usando startService(). El Service se ejecutará hasta que se complete el código o hasta que Android decida que se debe eliminar. Mire en bound services. En su Activity.onDestroy() debe llamar al unbindService().

4

En realidad, hay diferentes tipos de servicios que puede implementar. Use un Service en lugar de IntentService. Allí tiene que mirar START_STICKY, START_NOT_STICKY y START_REDELIVER_INTENT puede mantener su servicio ejecutándose en segundo plano, incluso si su actividad muere. Android services

1

En su IntentService puede anular onStartCommand() devolver START_REDELIVER_INTENT

Entonces, si muerto, su servicio se reiniciará automáticamente por el sistema después de un tiempo con la misma intención.

Asegúrese de llamar a la aplicación súper en onStartCommand() así:

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    super.onStartCommand(intent,flags,startId); 
    return START_REDELIVER_INTENT; 
} 
Cuestiones relacionadas