уведомление о загрузке файла плохое поведение Android - PullRequest
0 голосов
/ 24 января 2012

Здравствуйте, у меня есть класс для загрузки файла. Он работает как положено, за исключением уведомления об удалении, когда загрузка завершена. Я отмечаю, что два идентичных раздела кода в действительности дают разные вещи. Я имею в виду, что теперь у меня следующее поведение: я начинаю скачивать файл и могу отменить их, нажав на уведомление. Загрузка отменена, как и ожидалось, та, которая должна быть прервана. Но если ждать, пока загрузка закончится. Второе уведомление будет прервано, когда закончится первое, а первое уведомление останется в панели уведомлений навсегда. Я не знаю, где моя ошибка. Пример кода:

public class DownloadVkVideoFiles extends AsyncTask<String, Integer, String>{
    private static String BROADCAST_ACTION = "com.yourshows.helper.DownloadVkVideoFile.CANCELID";

    public DownloadVkVideoFiles(Context c, String title, int taskId) {
    this.context = c;
    this.notifyId = taskId; //this is unique notification Id
    this.BROADCAST_ACTION += String.valueOf(taskId); //broadcast action for pending intent
    }

   @Override
   protected void onPreExecute() {
        // execute the status bar notification
        createNotification();
        super.onPreExecute();
        IntentFilter filter = new IntentFilter();
        filter.addAction(BROADCAST_ACTION);
        context.registerReceiver(receiver, filter); //register Receiver for cancel download file
     }

    @Override
    protected String doInBackground(String... params) { //download file}

    @Override
    public void onProgressUpdate(Integer... progress) {
         notification.contentView.setProgressBar(R.id.progressBar, 100, progress[0], false);
         // inform the progress bar of updates in progress
         notificationManager.notify(notifyId, notification);
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        notificationManager.cancel(notifyId); // close finished notification
        unregisterReceiver();
        LOG.send(LOG.I, TAG, "Notification finished with ID = " + notifyId);
    }

    @Override
     protected void onCancelled() {
        super.onCancelled();
        notificationManager.cancel(notifyId);
        unregisterReceiver();

        LOG.send(LOG.I, TAG, "Notification finished with ID = " + notifyId);
    }
}

UPD: createNotification:

    public void createNotification() {
         notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
         Intent notificationIntent = new Intent();
         notificationIntent.setAction(BROADCAST_ACTION);

         PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, notificationIntent,
            PendingIntent.FLAG_CANCEL_CURRENT);

         RemoteViews contentView = new RemoteViews(context.getPackageName(), R.layout.download_notification);

         // TODO change to shows title
         tickerText = context.getResources().getText(R.string.downloadTitle);
         icon = android.R.drawable.stat_sys_download;
         time = System.currentTimeMillis();

         notification = new Notification(icon, tickerText, time);
         notification.flags |= Notification.FLAG_ONGOING_EVENT;
         notification.flags |= Notification.FLAG_AUTO_CANCEL;
         notification.flags |= Notification.FLAG_FOREGROUND_SERVICE;

         contentView.setImageViewResource(R.id.downloadImage, R.drawable.download);
         contentView.setTextColor(R.id.title, notification_text_color);
         contentView.setFloat(R.id.title, "setTextSize", notification_text_size - 3);
         contentView.setTextViewText(R.id.title, title);
         contentView.setProgressBar(R.id.progressBar, 100, 0, false);

         notification.contentIntent = pendingIntent;
         notification.contentView = contentView;
        //notificationManager.notify(notifyId, notification);
         service.startForeground(notifyId, notification);
    }

1 Ответ

0 голосов
/ 24 января 2012

Я пытался сделать что-то подобное в своем проекте, но если вы попытаетесь загрузить более 5 файлов, загружаемые файлы будут вести себя неожиданно, если все файлы повреждены.поэтому я изменяю структуру на Service вместо AsyncTask.загрузки, сохраненные в очереди, при загрузке, одна за другой, панель уведомлений содержит номер загрузки индикатора выполнения, текущее имя файла и процент загрузки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...