Уведомление Android не обновляется, когда активны несколько - PullRequest
0 голосов
/ 30 января 2019

Я разрабатываю приложение, которое загружает файлы.У меня есть уведомление, которое отслеживает ход каждой загрузки, и несколько файлов могут быть загружены одновременно.Когда отображается одно уведомление, проблемы не возникают.Однако, когда несколько уведомлений отображаются одновременно, они перестают обновляться при достижении определенной точки.

Вот соответствующий код, который я использую для обновления уведомлений:

private static volatile int _id = 1312;

private int notifId;
private DownloadState state;
private Context context;
private NotificationManagerCompat _notifs;
private NotificationCompat.Builder _builder;

public DownloadNotifier(Context cxt, DownloadState _state) {
    context = cxt;
    state = _state;
    state.setListener(this);
    notifId = _id++;
    _notifs = NotificationManagerCompat.from(context);
    createNotify();
    _notifs.notify(notifId, _builder.build());
}

public void createNotify() {
    _builder = new NotificationCompat.Builder(context, NOTIF_CHANNEL)
         .setContentTitle(DownloadState.Status.getString(state.getStatus()))
            .setContentText(state.getTitle())
            .setSmallIcon(android.R.drawable.stat_sys_download)
            .setPriority(NotificationCompat.PRIORITY_DEFAULT)
            .setProgress(100, 0, false)
            .setOngoing(true);
}

private int _pUpdates = 0;

@Override
public void onProgress(DownloadState state) {
    if (state.getStatus() != DownloadState.Status.DOWNLOADING)
        return;
    if (_pUpdates % 10 == 0 || state.getProgress() == state.getSize()) {
        _builder.setContentTitle(DownloadState.Status.getString(state.getStatus()));
        _builder.setProgress((int) state.getSize(), (int) state.getProgress(), false);
        _builder.setContentText(state.getTitle() + " (" + DownloadState.getHumanReadableSize(state.getProgress()) + "/" + DownloadState.getHumanReadableSize(state.getSize()) + ")");
        _notifs.notify(notifId, _builder.build());
    }
    _pUpdates++;
}

@Override
public void onStatus(DownloadState state) {
    if (_builder == null)
        return;
    _builder.setContentTitle(DownloadState.Status.getString(state.getStatus()));
    if (state.getStatus() != DownloadState.Status.DOWNLOADING)
        _builder.setProgress(0, 0, true);
    if (state.getStatus() == DownloadState.Status.COMPLETE) {
        _builder.setSmallIcon(android.R.drawable.stat_sys_download_done);
        _builder.setOngoing(false);
        _builder.setProgress(0, 0, false);
        state.setListener(null);
    }
    Log.e("Notif", "Download state change " + DownloadState.Status.getString(state.getStatus()) + " (" + notifId + ").");
    _notifs.notify(notifId, _builder.build());
}

Всякий раз, когдаonProgress вызывается обратный вызов, уведомление успешно обновляется, как и ожидалось.Тем не менее, когда вызывается обратный вызов onStatus, уведомление не может измениться, если видимы более одного уведомления, отправленного этим кодом.Я не вижу причин, по которым это должно происходить.

Я уверен, что обратный вызов onStatus является последним из вызываемых (т. Е. Метод onProgress не запускается после метода onStatus, поэтому необновление уведомления, как если бы метод onStatus никогда не выполнялся).

Logcat также успешно сообщает о сообщении "Download state change...", поэтому я знаю, что выполняется обратный вызов, и я поставил точку останова в операторе state.getStatus() == DownloadState.Status.COMPLETE if дляубедитесь, что это условие действительно выполняется, и код в этом операторе был запущен (и был)уведомление (т. е. индикатор выполнения все еще отображается, заголовок не изменяется и т. д.).

Примечание. Эта проблема, по-видимому, относится только к Android Oreo.

...