Prevenir el error "el proceso es malo" de Android
intentservice (2)
Buena suerte es que tiene que ver con el manejo del ciclo de vida de la actividad.
Me recuerda a un caso que resolví recientemente sin entenderlo completamente porque la documentación no es muy específica en lo que se puede confiar después de que se llame a onStop () en su Actividad. Y qué es exactamente lo que no debes hacer ...
Así que solo puedo darte algunos consejos:
Si mi suposición es correcta, tiene problemas para no ser restaurado correctamente cuando su aplicación se elimina (parcialmente) de la memoria. Intente establecer el límite para aplicaciones de fondo en la configuración de desarrollador a "ninguna". Sospecho que con esta configuración, su problema se reproducirá completamente al ponerlo en segundo plano. De lo contrario, probablemente pueda dejar de leer aquí.
Tenía un hilo que seguía corriendo después de onStop () que también mantenía algunas referencias. Detener el hilo en onPause () y también esperar a que se solucionara el problema. También necesitaba sincronizar mi onStop () porque el bloqueo de onPause () dio lugar a que onStop () se pusiera en paralelo. También necesitaba mover parte de mi iniciación de onCreate () a onResume (). Pero eso fue bastante obvio una vez que me di cuenta de qué derribar en onResume () y onStop ().
Probablemente el tipp con la estática va en la misma dirección.
El proceso es malo. El error no parece estar muy bien documentado, y solo he podido encontrar soluciones. En cambio, estoy interesado en la causa de este error y en cómo evitar que suceda, y no en cómo manejarlo manualmente a través de reiniciar, reiniciar la aplicación, etc.
Mi aplicación particular utiliza un AlarmManager para iniciar un IntentService que se ejecuta durante ~ 10s cada ~ 30s. Esto se llama en la creación de la aplicación:
Intent serviceIntent = new Intent(appContext, MyService.class);
serviceIntent.putExtra("service_extra", extra);
launchService = PendingIntent.getService(
appContext,
LAUNCH_SERVICE_REQUEST_CODE,
scanIntent,
PendingIntent.FLAG_UPDATE_CURRENT
);
alarmManager.setInexactRepeating(
AlarmManager.RTC,
System.currentTimeMillis() + interval,
interval,
launchService
);
Esto funciona como se espera la mayor parte del tiempo. Sin embargo, muy ocasionalmente el servicio no se iniciará por un período de tiempo indefinido, a veces horas a la vez. El siguiente error se ve cada ~ 30 s, así que sé que mis alarmas están intentando iniciar IntentService según lo programado, pero el intento de error con un proceso es un error erróneo.
Unable to launch app com.example.android/10024 for service Intent { cmp=com.example.android/.MyService (has extras) }: process is bad
Esto se soluciona simplemente reabriendo la aplicación. ¡Pero necesito saber cómo prevenirlo! El propósito de este servicio es ejecutarse en segundo plano mientras las actividades se detienen o destruyen, por lo que debe evitar este error sin la interacción del usuario o una solución alternativa.
El error "el proceso es malo" ocurre después de que su servicio falla un par de veces. El sistema evita que vuelva a aparecer e imprime ese mensaje. Puede borrar el recuento de fallos reiniciando o más rápidamente destruyendo el servidor del sistema:
adb shell killall system_server
Esto es efectivamente un "reinicio suave" y eliminará / reiniciará cualquier proceso que tenga.