Larga vida a Android Service: "servicio inmortal"

Leer http://developer.android.com/reference/android/app/Service.html y http://developer.android.com/guide/components/services.html He leído dos importantes declaraciones:

1) Hay dos razones por las cuales un servicio puede ser ejecutado por el sistema. Si alguien llama a Context.startService () , el sistema recuperará el servicio (creándolo y llamando a su método onCreate () si es necesario) y luego llamará a su método onStartCommand (Intent, int, int) con los argumentos suministrados por el cliente. El servicio continuará funcionando hasta que Context.stopService () o stopSelf () se llame.

2) Un servicio iniciado puede usar la API startForeground (int, Notification) para poner el servicio en un estado en primer plano, donde el sistema considera que es algo que el usuario está consciente y por lo tanto no es un candidato para matar cuando la memoria es baja. (Todavía es teóricamente posible que el servicio sea asesinado bajo la presión de la memoria extrema de la aplicación de primer plano actual, pero en la práctica esto no debería ser una preocupación.)

Mi objetivo es crear un servicio remoto que se ejecute en un proceso separado (declarando android: proceso en Manifest) y asegurarse de que el proceso está siempre activo, a menos que la recuperación de SO Android memoria.

¿Cuáles son las contraindicaciones y cuáles son las diferencias entre estas tres implementaciones?

Llamando startService () de onBind ():

public class ExampleService extends Service { ... @Override public IBinder onBind(Intent intent) { startService(new Intent(this, ExampleService.class)); return mBinder; } @Override public void onCreate() { super.onCreate(); } ... } 

Llamando startForegorund () de onCreate ():

 public class ExampleService extends Service { ... @Override public IBinder onBind(Intent intent) { return mBinder; } @Override public void onCreate() { super.onCreate(); ... startForeground(ord, note); } ... } 

Llamar startForegorund () de onCreate () y startService de onBind ():

 public class ExampleService extends Service { ... @Override public IBinder onBind(Intent intent) { startService(new Intent(this, ExampleService.class)); return mBinder; } @Override public void onCreate() { super.onCreate(); ... startForeground(ord, note); } ... } 

Los clientes utilizarán este servicio llamando a bindService () y utilizando IBinder.

Tengo más información sobre estos 3 casos de uso, he intentado estos tres casos y para cada uno tomé "procesos de actividad de dumpsys" después de iniciar la aplicación, enlazar servicio y poner actividad en segundo plano (presionando el botón Inicio):

Primer caso (sólo llamar a startService () en onBind ()):

 *APP* UID 10137 ProcessRecord{40b01d30 6719:com.mypackage:service_process/10137} class=com.mypackage.app.MyApp dir=/data/app/com.mypackage-1.apk publicDir=/data/app/com.mypackage-1.apk data=/data/data/com.mypackage packageList=[com.mypackage] thread=android.app.ApplicationThreadProxy@40d1b540 curReceiver=null pid=6719 starting=false lastPss=0 lastActivityTime=-1m42s491ms lruWeight=671144 keeping=true hidden=false empty=true oom: max=15 hidden=8 curRaw=4 setRaw=4 cur=4 set=4 curSchedGroup=1 setSchedGroup=1 setIsForeground=false foregroundServices=false forcingToForeground=null persistent=false removed=false adjSeq=5157 lruSeq=1017 lastRequestedGc=-1m46s82ms lastLowMemory=-1m46s82ms reportLowMemory=false services=[ServiceRecord{40a68aa0 com.mypackage/.model.page.ServerConnection}] connections=[ConnectionRecord{40d11118 com.mypackage/.util.CommonService:@40d12928}, ConnectionRecord{40bca008 com.mypackage/.model.page.ServerConnection:@40d0bd08}, ConnectionRecord{40d64030 com.mypackage/.util.log.LoggerService:@40d34b38}] Running processes (most recent first): Proc #16: adj=svc /B 40b01d30 6719:com.mypackage:service_process/10137 (started-services) 

Segundo caso (solo llamando a startForeground () en onCreate ()):

 *APP* UID 10137 ProcessRecord{40c47420 7921:com.mypackage:service_process/10137} class=com.mypackage.app.MyApp dir=/data/app/com.mypackage-2.apk publicDir=/data/app/com.mypackage-2.apk data=/data/data/com.mypackage packageList=[com.mypackage] thread=android.app.ApplicationThreadProxy@40a044c8 curReceiver=null pid=7921 starting=false lastPss=0 lastActivityTime=-27s701ms lruWeight=1232643 keeping=true hidden=false empty=false oom: max=15 hidden=8 curRaw=2 setRaw=2 cur=2 set=2 curSchedGroup=0 setSchedGroup=0 setIsForeground=false foregroundServices=true forcingToForeground=null persistent=false removed=false adjSeq=6068 lruSeq=1170 lastRequestedGc=-32s123ms lastLowMemory=-32s123ms reportLowMemory=false services=[ServiceRecord{40b3b1d0 com.mypackage/.model.page.ServerConnection}] connections=[ConnectionRecord{40b18da8 com.mypackage/.util.log.LoggerService:@40b18b88}, ConnectionRecord{40c86fa0 com.mypackage/.model.page.ServerConnection:@40c86d80}, ConnectionRecord{40c869a0 com.mypackage/.util.CommonService:@409626c8}] Running processes (most recent first): Proc #18: adj=prcp /F 40c47420 7921:com.mypackage:service_process/10137 (foreground-service) 

Tercer caso (llamando a: startService () en onBind () y startForeground () en onCreate ()):

 *APP* UID 10137 ProcessRecord{40d35d30 8407:com.mypackage:service_process/10137} class=com.mypackage.app.MyApp dir=/data/app/com.mypackage-1.apk publicDir=/data/app/com.mypackage-1.apk data=/data/data/com.mypackage packageList=[com.mypackage] thread=android.app.ApplicationThreadProxy@40a6f7a0 curReceiver=null pid=8407 starting=false lastPss=0 lastActivityTime=-6s98ms lruWeight=1423485 keeping=true hidden=false empty=false oom: max=15 hidden=7 curRaw=2 setRaw=2 cur=2 set=2 curSchedGroup=0 setSchedGroup=0 setIsForeground=false foregroundServices=true forcingToForeground=null persistent=false removed=false adjSeq=6565 lruSeq=1289 lastRequestedGc=-10s334ms lastLowMemory=-10s334ms reportLowMemory=false services=[ServiceRecord{40ba7650 com.mypackage/.model.page.ServerConnection}] connections=[ConnectionRecord{40ac5408 com.mypackage/.model.page.ServerConnection:@40ac5228}, ConnectionRecord{40c760e8 com.mypackage/.util.CommonService:@40c31fa8}, ConnectionRecord{40c31c00 com.mypackage/.util.log.LoggerService:@40bc4bf0}] Running processes (most recent first): Proc #13: adj=prcp /F 40d35d30 8407:com.mypackage:service_process/10137 (foreground-service) 

El caso por defecto (no llamando a startService () y startForeground (), sino sólo al servicio de enlace):

 *APP* UID 10137 ProcessRecord{40c3eb78 5609:com.mypackage:service_process/10137} class=com.mypackage.app.MyApp dir=/data/app/com.mypackage-2.apk publicDir=/data/app/com.mypackage-2.apk data=/data/data/com.mypackage packageList=[com.mypackage] thread=android.app.ApplicationThreadProxy@40a34c90 curReceiver=null pid=5609 starting=false lastPss=0 lastActivityTime=-5m31s175ms lruWeight=227344 keeping=false hidden=true empty=true oom: max=15 hidden=7 curRaw=7 setRaw=7 cur=7 set=7 curSchedGroup=1 setSchedGroup=1 setIsForeground=false foregroundServices=false forcingToForeground=null persistent=false removed=false adjSeq=4483 lruSeq=887 lastWakeTime=0 time used=0 lastCpuTime=0 time used=0 lastRequestedGc=-2m1s649ms lastLowMemory=-6m7s191ms reportLowMemory=false services=[ServiceRecord{40d559b8 com.mypackage/.model.page.ServerConnection}] connections=[ConnectionRecord{40beeef0 com.mypackage/.model.page.ServerConnection:@40bd4620}, ConnectionRecord{40bc4c60 com.mypackage/.util.CommonService:@40b69ea0}, ConnectionRecord{40ac74b0 com.mypackage/.util.log.LoggerService:@40ab5d60}] Running processes (most recent first): Proc #22: adj=bak+3/B 40c3eb78 5609:com.mypackage:service_process/10137 (bg-empty) 

Creo que lo más importante es el valor de adj que cambia en todos los casos y asume estos valores:

1) svc

2) prcp

3) bak

  • No se puede obtener el historial del navegador nativo de SAMSUNG S4
  • Inicio de un servicio en la plataforma android
  • Null intent redelivered to Service onStartCommand ()
  • OnHandleIntent () no se llama en IntentService
  • Enviar datos del servicio a la actividad Android
  • No obtener el valor actualizado de la preferencia compartida en el servicio
  • Transmisión local desde Servicio no recibido por Actividad
  • Cómo obtener la ubicación actual latitud y longitud en android
  • WakefulIntentService aclaraciones de implementación
  • Cómo utilizar HdmiControlService
  • ¿Existe una manera sencilla de detener un servicio en respuesta a que un usuario haga clic en una notificación?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.