gpt4 book ai didi

android - 自定义 Android 下载服务 - 为每个文件提供进度通知行

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:09:11 24 4
gpt4 key购买 nike

我希望能够在通知栏中显示文件的多次下载,也可以取消。

我已经实现了一个自定义服务,它使用 AsyncTasks 并行执行多个下载。 OnPublishProgress 我正在尝试更新通知栏中的各个行以显示每个文件的下载进度。整整两天,我一直在尝试解决行闪烁、交换顺序以及有时只是空白或仅更新一行的问题。此外,点击该行以取消例程并不总是有效。

这是我的代码:

    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;
}

所以我尝试设置在点击通知时调用服务的操作,传递文件的 ID 以取消下载。谁能看到我做错了什么?我所追求的真的可能吗?在 Xoom 平板电脑上,通知闪烁很多,但在 Nexus 7 上却不那么频繁。所有设备最终都会不断交换行,这意味着您几乎不可能取消想要的下载。

如有任何建议,我们将不胜感激。

更新 1:我认为这可能是我遇到的问题之一: Android Service.startForeground does NOT respect notification id uniqueness

更新 2:通过调用 builder.setWhen(fixedTime) 修复了换出问题。显然,新的 dateTime 每次刷新时都会导致行重新排序。只需修复 Xoom 上的闪烁和“点击取消”功能即可。

更新 3:Xoom 上的闪烁已通过限制刷新调用得到修复。最后的代码防止通知在 100 毫秒内被更新多次。其余问题与取消有关。第一次点击取消有效,但对后续文件无效。我也无法清除行。

更新 4:单个取消问题是由类级别的 resultIntent 字段引起的。当我每次刷新通知时创建一个新的时,id 绑定(bind)。我还将标志更改为仅 Notification.FLAG_ONLY_ALERT_ONCE 并且仅使用 .notify() 而不是 startForeground()。

最佳答案

所有问题都已解决。我已经在我的原始帖子中添加了更新。总之:1) 小心 builder.setWhen(fixedTime)。2) 每 100 毫秒不要刷新超过一次3) 设置正确的标志。

关于android - 自定义 Android 下载服务 - 为每个文件提供进度通知行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13088330/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com