IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android在通知栏中显示进度条 -> 正文阅读

[移动开发]Android在通知栏中显示进度条

private NotificationManager notificationManager;
private NotificationCompat.Builder builder;
private NotificationClickReceiver notificationClickReceiver;

public class DownloadManager {
private static final String TAG = "DownloadManager";
private Context mContext;
private String downloadUrl;
private String savePath;
private DownloadRecord downloadRecord;
    /**
     * 下载
     *
     * @param context 上下文
     * @param downloadUrl 下载地址
     * @param savePath 下载后保存到本地的路径
     */
    public void download(Context context, String downloadUrl, String savePath) {
        this.mContext = context;
        this.downloadUrl = downloadUrl;
        this.savePath = savePath;
        try {
            downloadRecord = Downloader.createRecord(downloadUrl, savePath,
                    new DownloadListenerAdapter() {
                        @Override
                        public void onTaskStart(DownloadRecord record) {
                            Log.d(TAG, "onTaskStart");
                            initNotification();
                        }

                        public void onTaskPause(DownloadRecord record) {
                            Log.d(TAG, "onTaskPause");
                        }

                        public void onTaskCancel(DownloadRecord record) {
                            Log.d(TAG, "onTaskCancel");
                        }

                        public void onProgressChanged(DownloadRecord record, int progress) {
                            Log.d(TAG, "onProgressChanged progress=" + progress);
                            updateNotification(progress);
                        }

                        @Override
                        public void onTaskSuccess(DownloadRecord record) {
                            Log.d(TAG, "onTaskSuccess");
                            showInstall();
                        }

                        @Override
                        public void onTaskFailure(DownloadRecord record, Throwable throwable) {
                            Log.e(TAG, "onTaskFailure error=" + throwable);
                            updateNotification(-1);
                        }
                    });
        } catch (Exception x) {
            Log.e(TAG, "download error=" + x);
        }
    }

    /**
     * 初始化通知
     */
    private void initNotification() {
        try {
            notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
            // Android8.0及以后的方式
            if (Build.VERSION.SDK_INT >= 26) {
                // 创建通知渠道
                NotificationChannel notificationChannel = new NotificationChannel("download_channel", "下载",
                        NotificationManager.IMPORTANCE_DEFAULT);
                notificationChannel.enableLights(false); //关闭闪光灯
                notificationChannel.enableVibration(false); //关闭震动
                notificationChannel.setSound(null, null); //设置静音
                notificationManager.createNotificationChannel(notificationChannel);
            }
            builder = new NotificationCompat.Builder(mContext, "download_channel");
            builder.setContentTitle("已下载(0%)") //设置标题
                    .setSmallIcon(mContext.getApplicationInfo().icon) //设置小图标
                    .setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(),
                            mContext.getApplicationInfo().icon)) //设置大图标
                    .setPriority(NotificationCompat.PRIORITY_MAX) //设置通知的优先级
                    .setAutoCancel(false) //设置通知被点击一次不自动取消
                    .setSound(null) //设置静音
                    .setContentText("正在下载 点击取消") //设置内容
                    .setProgress(100, 0, false) //设置进度条
                    .setContentIntent(createIntent()); //设置点击事件
            notificationManager.notify(100, builder.build());
        } catch (Exception x) {
            Log.e(TAG, "initNotification error=" + x);
        }
    }

    /**
     * 刷新通知
     *
     * @param progress 百分比,此值小于0时不刷新进度条
     */
    private void updateNotification(int progress) {
        if (builder == null) {
            return;
        }
        if (progress >= 0) {
            builder.setContentTitle("已下载(" + progress + "%)");
            builder.setProgress(100, progress, false);
        }
        if (downloadRecord == null || downloadRecord.getState() == DownloadRecord.STATE_FAILURE) {
            builder.setContentText("下载失败 点击重试");
        } else if (progress == 100) {
            builder.setContentText("下载完成 点击安装");
            builder.setAutoCancel(true);
        }
        notificationManager.notify(100, builder.build());
    }

    /**
     * 设置通知点击事件
     *
     * @return 点击事件
     */
    private PendingIntent createIntent() {
        Intent intent = new Intent(mContext.getPackageName() + ".upgrade.notification");
        intent.setPackage(mContext.getPackageName());
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, intent,
                PendingIntent.FLAG_UPDATE_CURRENT);
        return pendingIntent;
    }

    /**
     * 注册通知点击监听
     */
    private void registerReceiver() {
        notificationClickReceiver = new NotificationClickReceiver();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(mContext.getPackageName() + ".upgrade.notification");
        mContext.registerReceiver(notificationClickReceiver, intentFilter);
    }

    /**
     * 处理通知栏点击事件
     */
    public class NotificationClickReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (!(mContext.getPackageName() + ".upgrade.notification").equals(action)) {
                return;
            }
            if (downloadRecord != null) {
                int state = downloadRecord.getState();
                Log.d(TAG, "onReceive state=" + state);
                switch (state) {
                    case DownloadRecord.STATE_CREATE:
                    case DownloadRecord.STATE_PENDING:
                    case DownloadRecord.STATE_RUNNING:
                    case DownloadRecord.STATE_PAUSE:
                        // 关闭通知栏
                        notificationManager.cancel(100);
                        break;
                    case DownloadRecord.STATE_SUCCESS:
                        // 显示安装确认弹窗
                        showInstallAlert(true);
                        break;
                    case DownloadRecord.STATE_FAILURE:
                        // 重新下载
                        download(mContext, this.downloadUrl, this.savePath);
                        break;
                    default:
                        break;
                }
            }
        }
    }
}

注:本文主要介绍通知栏中如何显示进度条,对于文中的下载逻辑以及下载状态等(Downloader、DownloadRecord、DownloadListenerAdapter)仅列出框架,并不进行深入讲解,因为这是另一个话题。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-28 09:27:50  更:2021-08-28 09:29:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/31 6:11:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码