¿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:

 @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?

¿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.

  • Android Whatsapp Inicio de llamada Receptor de difusión
  • Iniciar Broadcast Receiver de una actividad en android
  • NEW_OUTGOING_CALL no se llama en el Samsung Galaxy S
  • Detección de cambios en el tipo de red (TelephonyManager) en android
  • QueryBroadcastReceivers no encuentra los receptores registrados con registerReceiver
  • La notificación deleteIntent no funciona
  • Haga clic en la notificación GCM para no abrir la actividad deseada en Android Kitkat
  • No se puede registrar el receptor dinámicamente
  • ¿Hay alguna manera de recibir una notificación cuando el usuario apaga el dispositivo?
  • Iniciar la aplicación sin actividad, mi receptor de difusión no funciona
  • Actualización del componente UI de actividad de Broadcast Receiver?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.