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:
- ¿En qué hilo se ejecuta onReceive () de un BroacastReceiver registrado con LocalBroadcastManager?
- ¿No es necesario android.permission.RECEIVE_BOOT_COMPLETED?
- Android - "El receptor exportado no requiere permiso" en receptores destinados a recibir de los servicios del sistema
- ¿Por qué no funciona LocalBroadcastManager en lugar de Context.registerReceiver?
- Cómo saber si mi aplicación es administrada o no
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.
- Abrir la aplicación cuando se conecta con wifi
- Llamar a un método de actividad de una clase BroadcastReceiver
- Cómo recibir una emisión cuando la aplicación se instala o se elimina
- Android: BroadcastReceiver cuando inserta / extrae el dispositivo USB en / desde un puerto USB
- Receptor de difusión que no recibe la intención
- ¿Cómo enviar datos a través de PendingIntent a Broadcast?
- Actividad PopUp comienza de nuevo cuando se inicia desde "aplicaciones recientes"
- Boot BroadcastReceiver no funciona en los dispositivos Xiaomi
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
- Android Marshmallow – Barra de progreso de búsqueda personalizada que no se muestra
- Biblioteca de vista o fragmento para componer la interfaz de usuario para tipos de datos comunes