una studio progreso programacion pendientes notificaciones móviles muestra flecha detener descargas descarga desarrollo curso como cancelar barra aplicaciones aparecen aparece android service notifications android-service android-notifications

android - studio - no me aparece la flecha de descarga



Servicio de descarga de Android personalizado: proporciona una fila de notificación de progreso por archivo (1)

Todos los problemas fueron arreglados. He agregado las actualizaciones en mi publicación original. En resumen: 1) Tenga cuidado con builder.setWhen (fixedTime). 2) No actualice más de una vez cada 100 ms 3) Establezca las banderas correctas.

Me gustaría poder mostrar varias descargas de archivos en la barra de notificaciones que también se pueden cancelar.

Implementé un servicio personalizado que realiza múltiples descargas en paralelo usando AsyncTasks. OnPublishProgress Estoy tratando de actualizar las filas individuales en la barra de notificaciones para mostrar el progreso de la descarga de cada archivo. Durante dos días seguidos he intentado solucionar problemas con las filas parpadeando, intercambiando el orden y, a veces, solo quedando en blanco o solo actualizando una fila. Además, tocar la fila para cancelar la rutina no siempre funciona.

Aquí está mi código:

protected void showProgressNotification(final File item, int progress, boolean isDownloading) { String message = null; int smallIcon = 0; Bitmap largeIcon = null; int flags = 0; flags |= Notification.FLAG_ONGOING_EVENT; //flags |= Notification.FLAG_FOREGROUND_SERVICE; //flags |= Notification.FLAG_ONLY_ALERT_ONCE; //flags |= Notification.FLAG_AUTO_CANCEL; NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext()); builder.setAutoCancel(true); if (progress == 100) { largeIcon = BitmapFactory.decodeResource(getResources(), O2FolderListAdapter.getIconForItem(item, false)); smallIcon = R.drawable.ic_cloud_upto_date; if (isDownloading) { message = "Download completed. Tap to clear."; } else { message = "Upload completed. Tap to clear."; } } else if (progress >= 0) { largeIcon = BitmapFactory.decodeResource(getResources(), O2FolderListAdapter.getIconForItem(item, true)); if (isDownloading) { smallIcon = R.drawable.ic_cloud_downloading; message = "Downloading: " + progress + "%. Tap to cancel."; } else { smallIcon = R.drawable.ic_cloud_uploading; message = "Uploading: " + progress + "%. Tap to cancel."; } builder.setProgress(100, progress, false); } else { largeIcon = BitmapFactory.decodeResource(getResources(), O2FolderListAdapter.getIconForItem(item, true)); smallIcon = R.drawable.ic_cloud_conflict; if (isDownloading) message = "Cancelled download. Tap to clear."; else message = "Cancelled upload. Tap to clear."; } if (mResultIntent == null) { mResultIntent = new Intent(getApplicationContext(), CustomDownloadService.class); mResultIntent.addFlags(Notification.FLAG_ONGOING_EVENT); } mResultIntent.putExtra("cancel", item.getPath().hashCode()); Log.d("O2AbstractDownloadService", "Setup task id " + item.GetPath().hashCode()); if (mContentIntent == null) mContentIntent = PendingIntent.getService(getApplicationContext(), PI_REQ_CODE, mResultIntent, PendingIntent.FLAG_UPDATE_CURRENT); builder.setContentIntent(mContentIntent); builder.setLargeIcon(largeIcon); builder.setSmallIcon(smallIcon); builder.setContentTitle(item.GetName()); builder.setContentText(message); //if (progress != 100) //builder.addAction(R.drawable.ic_action_dark_cancel, "Cancel", contentIntent); final Notification notification = builder.build(); notification.flags = flags; notification.defaults = Notification.DEFAULT_LIGHTS; NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); // Id allows you to update the notification later on. //mNotificationManager.notify(item.getPath().hashCode(), notification); //startForeground(item.getPath().hashCode(), notification); // only update notification every 100ms (unless cancel or complete) long notificationDelay = 100; long now = System.currentTimeMillis(); if (mFutureCallTime == 0 || now > mFutureCallTime || progress == -1 || progress == 100) { startForeground(item.getPath().hashCode(), notification); //mNotificationManager.notify(item.GetPath().hashCode(), notification); } else Log.d("CustomDownloadService", "Called too often to notification"); mFutureCallTime = now + notificationDelay; }

Así que estoy tratando de configurar la acción para llamar al Servicio al tocar en la notificación, pasando la identificación del archivo para cancelar la descarga. ¿Alguien puede ver lo que estoy haciendo mal? Es lo que estoy buscando realmente posible? En una tableta Xoom, las notificaciones parpadean mucho, pero no muy a menudo en el Nexus 7. Todos los dispositivos terminan intercambiando filas constantemente, lo que significa que es prácticamente imposible cancelar la descarga que desea.

Cualquier consejo sería muy apreciado.

ACTUALIZACIÓN 1: Creo que esto puede estar causando uno de mis problemas: Android Service.startForeground NO respeta la exclusividad del id. De la notificación

ACTUALIZACIÓN 2: El problema de intercambio se solucionó llamando a builder.setWhen (fixedTime). Obviamente, el nuevo dateTime causaba que las filas se reordenasen cada vez que se actualizaba. Solo necesita corregir el parpadeo en Xoom y la función ''Tap to Cancel''.

ACTUALIZACIÓN 3: El parpadeo en Xoom se solucionó con la limitación de las llamadas para actualizar. El código al final impide que la notificación se actualice más de una vez cada 100 ms. Los problemas restantes tienen que ver con la cancelación. El toque para cancelar funciona la primera vez pero no funciona en los archivos posteriores. Además, no puedo borrar las filas.

ACTUALIZACIÓN 4: El único problema de cancelación fue provocado por el campo resultIntent en el nivel de clase. Cuando creé uno nuevo cada vez que actualizaba la notificación, los identificadores estaban atados. También cambié el indicador a Notification.FLAG_ONLY_ALERT_ONCE solamente y solo usé .notify () y no startForeground ().