¿Por qué el servicio todavía está funcionando si su proceso es matado?

He comprobado, a través de la descompilación, que en el manifiesto de algunas aplicaciones un servicio no se inicia con un proceso separado. Por cierto, en el gestor de tareas, aparece como "corriendo".

Por ejemplo, Facebook, en Android 4.4.2, tiene 0 procesos y 2 servicios en ejecución. De la documentación (y corregirme si estoy equivocado) he entendido que un servicio se ejecuta en el mismo proceso de su aplicación. Si el proceso muere, el servicio se detiene (y puede ser reiniciado automáticamente por un AlarmManager o START_STICKY).

Por lo tanto, si no se inicia dentro de un proceso separado, debe haber al menos un proceso donde el servicio puede ejecutarse. Entonces, ¿es posible que un servicio se ejecute incluso si no hay procesos? Repito, el servicio (de manifiesto) NO HA OBTENIDO la directiva androide: background

EDIT 1: Parece que es un error de Android 4.4.2. Vea esto y esto . En mi caso encuentro el problema cuando deslizo la aplicación de la lista (como se describe en el segundo enlace)

EDIT 2: Por favor, corrija si estoy equivocado, esto es lo que he entendido.

Un objeto Service se crea por primera vez cuando se llama a startService() . onCreate() será llamado en ese objeto Service y onStartCommand() seguirá. De ahora en adelante:

  • Si el proceso muere, el objeto de servicio todavía está allí (si stopSelf() no se llama) pero no se está ejecutando.
  • Si el servicio fallece, la única forma de volver a crear es START_STICKY (y otras constantes de reinicio) o una llamada manual a startService (). Cuando se cancela el servicio desde el sistema, onCreate se llamará de nuevo.

Ahora, este es el comportamiento normal en Android <4.4.2. En KitKat, si desliza la aplicación de la lista LRU, el proceso muere e incluso con START_STICKY no se reinicia automáticamente. La solución es un AlarmManager. ¿Es correcto?

Su Servicio es parte de su aplicación. Por definición, su aplicación se ejecuta cuando el servicio se está ejecutando. Cuando, por ejemplo, AlarmManager invoca su servicio a una hora programada, Android inicia primero un proceso para la aplicación (si aún no se está ejecutando) y, a continuación, invoca su servicio dentro de la aplicación que se está ejecutando.

En general, usted es correcto: Si la aplicación (proceso) muere, el Servicio morirá con él.

Android soporta un atributo Manifest, android:process , que le permite especificar que un componente particular de su aplicación debe ejecutarse en un proceso separado. Esto, esencialmente, ejecuta varias copias, idénticas, de su aplicación, en múltiples procesos. Android simplemente utiliza uno de los procesos para ejecutar un componente y otro para ejecutar el otro. Su aplicación se ejecuta en ambos.

La fuente de confusión es la forma en la página Configuración> Aplicaciones utiliza las palabras "proceso" y "servicio". Parece utilizar el primero para contar procesos con componentes de interfaz de usuario y el segundo para contar todos los demás procesos. Si utiliza adb para conectarse a su dispositivo y utilizar el comando "ps" obtendrá algo que refleja mejor el entendimiento común de esas palabras.

El principal problema con algunos de los sistemas operativos Android es cuando la aplicación cerrada, a continuación, el sistema operativo Android ( En algunos sistemas operativos ) va a matar el servicio, Si no eres capaz de reiniciar el servicio a continuación, llamar a un administrador de alarmas para iniciar el reciver como este,

El manifiesto es,

  <service android:name=".BackgroundService" android:description="@string/app_name" android:enabled="true" android:label="Notification" /> <receiver android:name="AlarmReceiver"> <intent-filter> <action android:name="REFRESH_THIS" /> </intent-filter> </receiver> 

IN Principio Actividad inicio alarma pesebre de esta manera,

 String alarm = Context.ALARM_SERVICE; AlarmManager am = (AlarmManager) getSystemService(alarm); Intent intent = new Intent("REFRESH_THIS"); PendingIntent pi = PendingIntent.getBroadcast(this, 123456789, intent, 0); int type = AlarmManager.RTC_WAKEUP; long interval = 1000 * 50; am.setInexactRepeating(type, System.currentTimeMillis(), interval, pi); 

Esto llamará reciver y reciver es,

 public class AlarmReceiver extends BroadcastReceiver { Context context; @Override public void onReceive(Context context, Intent intent) { this.context = context; System.out.println("Alarma Reciver Called"); if (isMyServiceRunning(this.context, BackgroundService.class)) { System.out.println("alredy running no need to start again"); } else { Intent background = new Intent(context, BackgroundService.class); context.startService(background); } } public static boolean isMyServiceRunning(Context context, Class<?> serviceClass) { ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningServiceInfo> services = activityManager.getRunningServices(Integer.MAX_VALUE); if (services != null) { for (int i = 0; i < services.size(); i++) { if ((serviceClass.getName()).equals(services.get(i).service.getClassName()) && services.get(i).pid != 0) { return true; } } } return false; } } 

Y este recién llegado Alaram llama una vez cuando la aplicación android se abre y cuando la aplicación es closed.SO el servicio es así,

 public class BackgroundService extends Service { private String LOG_TAG = null; @Override public void onCreate() { super.onCreate(); LOG_TAG = "app_name"; Log.i(LOG_TAG, "service created"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i(LOG_TAG, "In onStartCommand"); //ur actual code return START_STICKY; } @Override public IBinder onBind(Intent intent) { // Wont be called as service is not bound Log.i(LOG_TAG, "In onBind"); return null; } @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) @Override public void onTaskRemoved(Intent rootIntent) { super.onTaskRemoved(rootIntent); Log.i(LOG_TAG, "In onTaskRemoved"); } @Override public void onDestroy() { super.onDestroy(); Log.i(LOG_TAG, "In onDestroyed"); } } 
  • ¿Qué ocurre cuando la actividad se bloquea?
  • No obtener el valor actualizado de la preferencia compartida en el servicio
  • Necesidad de obtener un servicio para hablar de la actividad
  • ¿Cuál es la diferencia entre un IntentService y un Servicio?
  • Cómo agregar nuestro propio servicio de sistema en Android Framework?
  • Detectar la contraseña de bloqueo de la pantalla de bloqueo por el usuario en Android
  • Matar la aplicación android del administrador de tareas mata los servicios iniciados por la aplicación
  • ¿Por qué no hay una API de Android para obtener la actividad actual?
  • ¿Cómo dejar de ejecutar los servicios?
  • ¿Tengo razón sobre las principales diferencias entre la actividad, el servicio y la difusión en Android
  • Listener de Internet Ejemplo de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.