Android - 正确更新通知进度条

 wsx迪_257 发布于 2023-02-08 19:33

我仍然是Android的新手,我正在努力改进我的通知进度条以使其更顺畅,不会为我的Pebble点燃一百万次更新并以"正确的方式"进行.此代码工作"正常",就像我使用它时,通知绘制和进度条按预期完成.

当我将Pebble手表设置为接受我的应用程序通知时,这对我来说成了一个问题.这导致每个上传的图像振动约50次,具体取决于上传速度的速度.

作为一个初学者,我认为我这样做是错的,有一个更好的方法来做我想做的事情.

我的通知的进度条使用以下代码更新:

private int upload_progress;
private Long time_previous_progress = Calendar.getInstance().getTimeInMillis();

protected void onProgressUpdate(Integer... progress) {
    Long time_now = Calendar.getInstance().getTimeInMillis();
    if(
       ((time_now - time_previous_progress) < 55) // 55ms minimum delay
       || (progress[0] < 0 && progress[0] > 100)  // progress >0 && <100
       || progress[0].equals(upload_progress)     // progress changed
       || ! App.getStatus()                       // watcher is running
       )
    {
        return;
    }
    time_previous_progress = time_now;
    upload_progress = progress[0];
    int upload_counter = getUploadCounter();
    int upload_total = db.getReadyImagesCount();
    NotificationHandler.notify(context, upload_progress, upload_counter, (upload_total + upload_counter));
}

然后使用以下代码生成通知:

public static int notify(Context context, Integer progress, Integer upload_count, Integer upload_total)
{
    Bitmap bm = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher);
    String notif_title = context.getResources().getString(R.string.instant_upload_title);

    String notif_progress = context.getResources().getString(R.string.instant_upload_progress);
    String notif_ticker = String.format(notif_progress, upload_count, upload_total);
    String notif_msg = String.format(notif_progress, upload_count, upload_total);

    Intent intent_swipe = new Intent(context, NotifyReceiver.class);
    intent_swipe.setAction("notification_cancelled");
    PendingIntent pendingIntent_swipe = PendingIntent.getBroadcast(context, 0, intent_swipe, PendingIntent.FLAG_CANCEL_CURRENT);

    Intent intent_click = new Intent(context, Settings.class);
    intent_click.putExtra("notification_clicked", true);
    PendingIntent pendingIntent_click = PendingIntent.getActivity(context, 0, intent_click, PendingIntent.FLAG_CANCEL_CURRENT);

    int pro_max = 100;
    int pro_cur = 0;
    if(progress < 100)
    {
        pro_cur = progress;
    }else{
        pro_cur = pro_max = 0;
    }

    //new NotificationCompat.Builder(context)
    NotificationCompat.Builder builder = new NotificationCompat.Builder(context) //PixelRelayApplication.getNotificationBuilder()
        .setTicker(notif_ticker)
        .setContentTitle(notif_title)
        .setContentText(notif_msg)
        .setNumber(upload_count)
        .setSmallIcon(R.drawable.ic_launcher)
        .setLargeIcon(bm)
        .setContentIntent(pendingIntent_click)
        .setDeleteIntent(pendingIntent_swipe)
        .setAutoCancel(true)
        .setOngoing(true)
        .setWhen(Calendar.getInstance().getTimeInMillis())
        .setProgress(pro_max, pro_cur, false);

    Notification notification = builder.build();

    // Put the auto cancel notification flag
    notification.flags |= Notification.FLAG_AUTO_CANCEL | Notification.FLAG_ONLY_ALERT_ONCE;
    NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
    notificationManager.notify(NOTIFY_ME_ID, notification);
    return NOTIFY_ME_ID;
}

Avanz.. 10

您可以使用正常工作的开源代码,通过Github访问它的想法:Progress Watch - Pebble的进度条表盘.如果您决定重用代码,我的建议是:

给予适当的信誉

如果您仍然发现某些内容可以改进,请通知作者

如果添加一些新功能,请创建一个分支并提交补丁


小智.. 5

我通过在第一个通知后设置进行中标记来解决此问题。

因此,请重新使用构建器,并在发送第一个通知之后,更新构建器,以使其创建正在进行的通知:

builder.setOngoing(true);

当然,这也意味着更新的通知将继续进行,http://developer.android.com/reference/android/app/Notification.Builder.html#setOngoing(boolean)

1 个回答
  • 我通过在第一个通知后设置进行中标记来解决此问题。

    因此,请重新使用构建器,并在发送第一个通知之后,更新构建器,以使其创建正在进行的通知:

    builder.setOngoing(true);

    当然,这也意味着更新的通知将继续进行,http://developer.android.com/reference/android/app/Notification.Builder.html#setOngoing(boolean)

    2023-02-08 19:35 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有