BroadcastReceiver onReceive () se llama dos veces

En mi aplicación, estoy utilizando DownloadManager, para descargar PDF's, que notifica la aplicación a través de BroadcastReceiver una vez que la descarga se ha completado. Mi problema es el método onReceive () de BroadcastReceiver se está llamando dos veces. El código es el siguiente:

En mi adaptador de lista, se ejecuta un bucle for para descargar los pdf seleccionados. El código de descarga se escribe en otra clase de la siguiente manera:

public static void downloadCheat(final SherlockFragmentActivity activity, final String cheatName, String pathOnServer){ Request request = new Request( Uri.parse(ApplicationConstants.CHEAT_DOWNLOAD_SERVER_URL + "/" + pathOnServer + cheatName + ".pdf")); if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) { request.setShowRunningNotification(true); } else { request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); } final DownloadManager dm = (DownloadManager) activity .getSystemService(Context.DOWNLOAD_SERVICE); final long enqueue = dm.enqueue(request); BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); long i = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1); System.out.println(i); if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) { Query query = new Query(); query.setFilterById(enqueue); Cursor c = dm.query(query); if (c.moveToFirst()) { int columnIndex = c.getColumnIndex(DownloadManager.COLUMN_STATUS); if (DownloadManager.STATUS_SUCCESSFUL == c.getInt(columnIndex)) { } } //create custom notification } } }; activity.registerReceiver(receiver, new IntentFilter( DownloadManager.ACTION_DOWNLOAD_COMPLETE)); } 

Estoy intentando agregar notificaciones para cada descarga de PDF. Esto funciona perfectamente con los administradores de descargas propia notificación interna para HoneyComb y versiones anteriores, pero para GingerBread no funciona y por lo tanto tengo que empujar mi propia notificación personalizada. Así que necesito determinar la hora exacta cuando el pdf se descarga por completo. A partir de ahora soy capaz de empujar mi propia notificación personalizada, pero las notificaciones vienen dos veces por cada descarga de pdf (Como onReceive () está recibiendo dos veces para cada pdf). ¿Puede alguien explicar por qué onReceive () se llama dos veces (por cada pdf). ¿Hay alguna solución para esto? También podría alguien recomendar por favor cómo el receptor de la difusión puede ser un-registrado en mi caso aquí? El código antedicho no es una parte de la actividad, así que no estoy seguro cómo cancelar el registro del receptor.

Gracias por detenernos y leer el post.

Normalmente registra los receptores onResume() y onPause() registro en onPause() . ¿Lo estás haciendo?


Creo que puede haber malentendido originalmente lo que estaba tratando de hacer. Debería poder llamar a unregisterReceiver de onReceive . ¿Hace esto lo que quieres?

Usted dijo que está descargando dos pdfs. Sólo veo una solicitud de descarga en su método. Así que supongo que lo que hiciste es llamar a ese método dos veces. Si eso es cierto, realmente registró dos receptores para recibir el evento ACTION_DOWNLOAD_COMPLETE .

Sólo tiene que registrarse una vez en onCreate o onStart o algunos otros métodos. Para fines de notificación, puede utilizar el intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1) para obtener la identificación de descarga, el ID es único para cada descarga. Puede utilizar este id para obtener la información sobre el archivo descargado y hacer su notificación específica de archivo.

Esto parece el mismo error que se describe aquí: https://code.google.com/p/android/issues/detail?id=18462

  • Actividad de Android sin GUI
  • Seguimiento de la duración de una llamada telefónica
  • Android: ejecutando una tarea de fondo con AlarmManager
  • Enumeración usb Android
  • ¿Cómo inicio mi aplicación al inicio?
  • Enviar la emisión con la combinación de localbroadcastmanager sendorderedbroadcast
  • ¿Cómo detectar cuando un usuario se conecta auriculares en el dispositivo Android? (Opuesto de ACTION_AUDIO_BECOMING_NOISY)
  • Huh? FindViewById () no se puede llamar dentro de onReceive ()?
  • SMS recibidos en mi aplicación de SMS y en Hangouts, aunque llamo a abortBroadcast ()
  • Cómo detectar cuando se pulsa el botón de encendido en la clase Receptor de difusión cuando se activa el permiso Administrador de dispositivos en Android
  • Registrar un receptor de difusión de un servicio en un nuevo hilo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.