Как запретить панели уведомлений обновлять старые уведомления? - PullRequest
1 голос
/ 17 мая 2019

У меня есть приложение, которое загружает файл с сервера, у меня есть список файлов, которые пользователь может загрузить.

Пользователь нажимает кнопку загрузки 1 и начинает загрузку файлов, если пользователь нажимает кнопку загрузки 2 после завершения загрузки 1, он начинает загрузку второй загрузки третьей и ......

Моя проблема в том, что, когда программа завершает одну загрузку, она обновляет панель уведомлений, чтобы завершить загрузку, а также отправляет "намерение", поэтому, когда пользователь нажимает на уведомление, оно отправляет идентификатор загрузки, проблема в том, что если я скачаю больше одного файла, все намерения будут иметь один и тот же идентификатор ....

Ex: Я нажимаю donwlod 1 --- идентификатор для этой загрузки 123

если это единственный файл, который я загружаю, в порядке.

но если щелкнуть загрузку 2 --- идентификатор этой загрузки: 4321

Когда загрузка 2 будет завершена, на моей верхней панели я должен уведомить одну для загрузки 1 и другую для загрузки 2 и оба уведомления имеют одинаковый идентификатор в намерении "4321"

private boolean saveFile(ResponseBody body, String fileName, String id) {
        final int final_id = Integer.parseInt(id);
        Intent activityIntent = new Intent(this, MainActivity.class);
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0, activityIntent, 0);
        final NotificationCompat.Builder notification = new NotificationCompat.Builder(this, CHANNEL_2_ID)
                .setSmallIcon(R.drawable.ic_cloud_minload_black_24dp)
                .setContentTitle("Download")
                .setOnlyAlertOnce(true)
                .setContentText("Downloading......")
                .setPriority(NotificationCompat.PRIORITY_LOW)
                .setContentIntent(contentIntent);

        notificationManager.notify(final_id, notification.build());
        try {
            File futureStudioIconFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_minLOADS), fileName);

            InputStream inputStream = null;
            OutputStream outputStream = null;

            try {
                byte[] fileReader = new byte[4096];
                long fileS = body.contentLength();
                long fileDonwloaded = 0;

                inputStream = body.byteStream();
                outputStream = new FileOutputStream(futureStudioIconFile);

                while (true) {
                    int read = inputStream.read(fileReader);

                    if (read == -1) {
                        break;
                    } 
                    outputStream.write(fileReader, 0, read);

                    fileDonwloaded += read;

                    Long fileSD = fileDonwloaded;
                    Long fileS     = fileS;
                    int min = fileSD.intValue();
                    int max  = fileS.intValue();
                    int max2 = max - 1000000;
                    if( max2 > min) { 
                        notification.setProgress(max, min, false);
                        notificationManager.notify(final_id, notification.build());
                    } else {  
                        Intent notificationIntent = new Intent(getApplicationContext(), MainActivity.class);
                        String id_d = Integer.toString(final_id);
                        notificationIntent.putExtra("ID" , id_d);
                        notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                        PendingIntent pendingNotificationIntent = PendingIntent.getActivity(getApplicationContext(),0,notificationIntent,PendingIntent.FLAG_UPDATE_CURRENT);

                        notification.setContentText("Downnload Finished");
                        notification.setProgress(0, 0, false);
                        notification.setSmallIcon(R.drawable.ic_cloud_done_black_24dp);
                        notification.setOngoing(false);
                        notification.setAutoCancel(true);
                        notification.setContentIntent(pendingNotificationIntent);
                        notificationManager.notify(final_id, notification.build());
                    }
                }
                return true;
            } catch (IOException e) {
                return false;
            } finally {
                if (inputStream != null) {
                    inputStream.close();
                }

                if (outputStream != null) {
                    outputStream.close();
                }
            }
        } catch (IOException e) {
            return false;
        } 
    }
...