¿Cómo mantener la aplicación en el reloj ejecutándose sin que el sistema la suspenda? Método: para un servicio, primero puede configurarlo para que se ejecute en primer plano: public void MyService.onCreate() { super.onCreate(); Notificación de notificación = new Notification(android.R .drawable. my_service_icon, "my_service_name", System.currentTimeMillis()); PendingIntent p_intent = PendingIntent.getActivity(this, 0, new Intent(this, MyMainActivity.class), 0); ! , p_intent); Log.d(TAG, String.format("notificación = %s", notificación)); startForeground(0x1982, notificación); // ID de notificación: 0x1982, puede nombrarlo como desee. }Configuraciones importantes--------------------------------- Comparado con aplicaciones en /data/app, /system/app Las aplicaciones siguientes tienen más permisos. Por ejemplo, si establece el atributo persistente en verdadero en el archivo Manifest.xml, puede protegerlo de ataques de falta de memoria. Por ejemplo, el archivo AndroidManifest.xml para la aplicación "Phone": ... Cuando se establece, la aplicación se elevará al nivel del kernel y no se cerrará bajo ninguna circunstancia, y Configuración->Aplicación evitará que se detengan las operaciones. Registros anteriores: Proc #19: adj=svc /B 4067b028 255:com.xxx.xxx/10001 (started-services) # cat /proc/255/oom_adj Registros posteriores: PERS #19: adj=core / F 406291f0 155: com.xxx.xxx/10001 (solucionado) # cat /proc/155/oom_adj -12 # Este es CORE_SERVER_ADJ Nota: El oom_adj del proceso inicial es -16 (es decir, SYSTEM_ADJ).
SYSTEM_ADJ): cat /proc/1/oom_adjAndroid Parte de análisis relacionada: existe el siguiente código en el archivo frameworks/base/services/java/com/android/server/am/ActivityManagerService.java: final ProcessRecord addAppLocked(ApplicationInfo info) { Aplicación ProcessRecord = getProcessRecordLocked(info.processName, info.uid); if (app == null) { aplicación = newProcessRecordLocked( null, info, null); aplicación, verdadero, verdadero); } if ((info.flags& (ApplicationInfo.FLAG_SYSTEMApplicationInfo.FLAG_PERSISTENT)) == (ApplicationInfo.FLAG_SYSTEMApplicationInfo.FLAG_PERSISTENT)){app.persistent = true; es - 12. } if (app.thread == null && mPersistentStartingProcesses.indexOf(app) <.0) { mPersistentStartingProcesses.add(app); startProcessLocked(app, "aplicación agregada", app.processName } return app); Para los servicios principales (es decir, app.maxAdj = CORE_SERVER_ADJ(-12)), la aplicación requiere los indicadores FLAG_SYSTEM y FLAG_PERSISTENT FLAG_SYSTEM indica que la aplicación está ubicada en /system/app y FLAG_PERSISTENT indica el atributo PERSISTENT. Para frameworks/base/services/java/com/android/server/SystemServer.java, llame a ActivityManagerService.setSystemProcess(); para configurar su app.maxAdj. Principio: el proceso en Android se administra cuando el espacio de proceso del sistema es limitado. el proceso Se reciclará automáticamente según la prioridad. Esto plantea tres preguntas: 1) Reglas de reciclaje: ¿cuándo reciclar y cuál reciclar? 2) Evitar el homicidio: ¿Cómo prevenir el reciclaje? 3) Recuperación y preservación de datos: ¿Qué debo hacer si el proceso se recicla? Android divide los procesos en seis niveles, ordenados de mayor a menor prioridad: 1. Proceso en primer plano (FOREGROUND_APP) 2. Proceso visual (VISIBLE_APP) 3. Proceso de servicio secundario (SECONDARY_SERVER) 4. Proceso en segundo plano (HIDDEN_APP) 5 Nodo de suministro de contenido (CONTENT_PROVIDER). ) 6. Características del proceso vacío (EMPTY_APP): 1. Si un proceso contiene actividades de servicio y visualización, entonces el proceso debe clasificarse como un proceso de visualización en lugar de un proceso de servicio.