¿Es seguro iniciar un nuevo subproceso en un BroadcastReceiver?
Necesito realizar una operación de red en un BroadcastReceiver
.
Hasta ahora lo logro iniciando un nuevo hilo:
- Cómo desbloquear la pantalla cuando se llama BroadcastReceiver?
- ¿Cómo usar el método registerReceiver?
- Android: habilitar y servicios
- ¿Cómo puedo interceptar pulsaciones de botón en el auricular en Android?
- El BroadcastReceiver para la intención ACTION_MEDIA_BUTTON se activa TWICE por clic en MediaButton
@Override public void onReceive(Context context, Intent intent) { new Thread(new Runnable() { public void run() { // network stuff... } }).start(); }
¿Existe el riesgo de que el proceso se destruya antes de que se termine el hilo?
¿Es mejor usar un IntentService
en IntentService
lugar? Cualquier otro enfoque mejor?
- Informar la actividad de un BroadcastReceiver SÓLO si está en primer plano
- Mostrar la notificación de la barra de estado desde un BroadcastReceiver
- ANR Difusión de Intención {act = android.intent.action.SCREEN_OFF flg = 0x50000010}
- BroadcastReceiver onReceive no se llama
- Receptor de difusión para detectar el inicio de la aplicación
- BroadcastReceiver: set android: proceso de forma programática
- Más de un BroadcastReceiver para la misma intención con doc contradictorio y práctica
- ACTION_MY_PACKAGE_REPLACED no recibido
¿Existe el riesgo de que el proceso se destruya antes de que se termine el hilo?
Si este receptor está registrado a través del manifiesto, sí.
Si este receptor se registra a través de registerReceiver()
, la vida útil de su proceso será determinada por otros componentes en ejecución.
¿Es mejor usar un IntentService en su lugar?
Si ese trabajo será de unos pocos milisegundos, IMHO, sí, probablemente en concierto con WakefulBroadcastReceiver
.
Cualquier otro enfoque mejor?
Hay una opción goAsync()
en BroadcastReceiver
que le da una ventana de tiempo para hacer el trabajo en otro hilo antes de activar un ANR. Evito esto, porque está mal documentado. Por ejemplo, no aborda directamente su pregunta: ¿cuál es la importancia del proceso mientras este hilo de fondo está haciendo su trabajo? ¿Esto mantiene el dispositivo despierto el tiempo suficiente para que nuestro trabajo se haga? Y así. Utilizaré un IntentService
o alguna otra forma de Service
, donde tengo una mejor comprensión del contrato.
No es la mejor idea. El ciclo de vida de un BroadcastReceiver dura el tiempo que tarda en terminar llamando aReceive (), después de que se destruye. Si comenzara a ejecutar un nuevo subproceso, existe la posibilidad de que el BroadcastReceiver se eliminara antes de que se complete el subproceso, lo que terminaría en un comportamiento inesperado.
La mejor opción sería iniciar un servicio de fondo, como usted dijo.
- Java.lang.UnsatisfiedLinkError
- Actualizar la aplicación de Android a la versión más reciente de OpenSSL