一个Notification 进度条插件(android,NJS实现,直接就可使用)

参考文章:http://ask.dcloud.net.cn/article/503

源码地址下载

如题,分享一个Notification 进度条插件(android,用js调用原生api实现,直接就可以使用).
参考1: http://ask.dcloud.net.cn/article/155
参考2:http://ask.dcloud.net.cn/question/2464

详细介绍: 最近有一个需求是,android更新资源包时,需要在通知栏里显示下载进度条,于是就搜索了下已有的解决方案
发现并没有现成的解决方案,于是参考了以上两个解决方案,结合了下,实现了直接能调用的js插件.

第一步(分析以上两种方案的缺陷):
第一种:功能上能实现需求,但是使用起来太麻烦,而且也不方便调试(需要离线打包后才能看到效果),
而且,我这里还遇到了一个问题,在 hbuild 6.9.2 中,我明明已经添加了自定义模块权限,但是却一直提示我 ***权限没有添加, 真的是把我弄的吐血了, 所以没办法,只能另谋他路.

第二种:使用起来很方便,但是却没有完全达到功能要求(只显示了普通通知,但没有显示进度条),而且在api <16 的机子上会报错.
于是在这个基础上,结合第一种方法.写了一个 工具类,实现android的通知栏控制(兼容了api11-16的通知显示)

源码:

/**
 * @description njs实现android原生功能
 * 1.通知栏消息
 * @see http://ask.dcloud.net.cn/article/503
 *
 * @author dailc
 * @version 1.0
 * @time 2016-01-08 08:38:20
 */
(function(obj) {
    var defaultTitle = ‘通知栏标题‘;
    var defaultContent = ‘通知内容‘;
    var defaultTicker = ‘通知提示‘;
    var defaultNotifyId = 1000;
    var defaultNumber = 1;
    /**
     * plusReady
     * @param {type} callback
     * @returns {Window}
     */
    obj.plusReady = function(callback) {
        if (window.plus) {
            setTimeout(function() { //解决callback与plusready事件的执行时机问题(典型案例:showWaiting,closeWaiting)
                callback();
            }, 0);
        } else {
            document.addEventListener("plusready", function() {
                callback();
            }, false);
        }
        return this;
    };
    /**
     * @description 比较两个版本大小
     * 比较版本大小,如果新版本nowVersion大于旧版本OldResourceVersion则返回true,否则返回false
     */
    function compareVersion(OldVersion, nowVersion) {
        if (!OldVersion || !nowVersion || OldVersion == ‘‘ || nowVersion == ‘‘) {

            return false;
        }
        //第二份参数 是 数组的最大长度
        var OldVersionA = OldVersion.split(".", 4);
        var nowVersionA = nowVersion.split(".", 4);
        for (var i = 0; i < OldVersionA.length && i < nowVersionA.length; i++) {
            var strOld = OldVersionA[i];
            var numOld = parseInt(strOld);
            var strNow = nowVersionA[i];
            var numNow = parseInt(strNow);
            //小版本到高版本
            if (numNow > numOld
                //||strNow.length>strOld.length
            ) {
                return true;
            } else if (numNow < numOld) {
                return false;
            }
        }
        //如果是版本  如 1.6 - 1.6.1
        if (nowVersionA.length > OldVersionA.length && 0 == nowVersion.indexOf(OldVersion)) {
            return true;
        }
    };
    /**
     * @description 通过push功能来推送消息
     */
    obj.sendNotificationByPush = function() {
        var options = {
            cover: false
        };
        var str = ": 欢迎使用Html5 Plus创建本地消息!";
        plus.push.createMessage(str, "LocalMSG", options);
    };
    (function() {
        /**
         * @constructor 创建通知栏进度条构造函数
         */
        function NotificationCustom() {
            if (plus.os.name != ‘Android‘) {
                return;
            }
            //当前版本号
            var SystemVersion = plus.os.version;
            var Context = plus.android.importClass("android.content.Context");
            var main = plus.android.runtimeMainActivity();
            var NotificationManager = plus.android.importClass("android.app.NotificationManager");
            var nm = main.getSystemService(Context.NOTIFICATION_SERVICE)
                // Notification build 要android api16以上才能使用(4.1.2以上)
            var Notification = null;
            if (compareVersion(‘4.1.1‘, SystemVersion) == true) {
                Notification = plus.android.importClass("android.app.Notification");
            } else {
                Notification = plus.android.importClass("android.support.v4.app.NotificationCompat");
            }
            if (Notification) {
                this.notifyManager = nm;
                this.mNotificationBuild = new Notification.Builder(main);
                //设为true代表常驻状态栏
                this.mNotificationBuild.setOngoing(false);
                this.mNotificationBuild.setContentTitle(defaultTitle);
                this.mNotificationBuild.setContentText(defaultContent);
                this.mNotificationBuild.setTicker(defaultTicker);
                //默认的push图标
                this.mNotificationBuild.setSmallIcon(17301620);
                //设置默认声音
                //console.log(‘默认:‘+plus.android.importClass("android.app.Notification").DEFAULT_SOUND);
                this.mNotificationBuild.setDefaults(plus.android.importClass("android.app.Notification").DEFAULT_SOUND);
                //this.mNotificationBuild.setNumber(defaultNumber)
            }
        };
        /**
         * @description 给android通知栏发送通知
         * @param {String} title 标题
         * @param {String} content  内容
         * @param {String} tickerTips  提示
         * @param {Number} notifyId id,默认为1000
         */
        NotificationCustom.prototype.setNotification = function(title, content, tickerTips,notifyId) {
            if (this.mNotificationBuild == null ||
                this.notifyManager == null) {
                return;
            }
            notifyId = (typeof(notifyId)==‘number‘)?notifyId:defaultNotifyId;
            title = title || defaultTitle;
            content = content || defaultContent;
            tickerTips = tickerTips || defaultTicker;
            this.mNotificationBuild.setContentTitle(title);
            this.mNotificationBuild.setContentText(content);
            this.mNotificationBuild.setTicker(tickerTips);
            //默认有声音
            this.mNotificationBuild.setDefaults(plus.android.importClass("android.app.Notification").DEFAULT_SOUND);
            this.notifyManager.notify(notifyId, this.mNotificationBuild.build());
        };
        /**
         * @description 设置进度条
         * @param {Number} progress
         * @param {String} title 标题
         * @param {String} content  内容
         * @param {String} tickerTips  提示
         * @param {Number} notifyId id,默认为1000
         */
        NotificationCustom.prototype.setProgress = function(progress, title, content, tickerTips,notifyId) {
            if (this.mNotificationBuild == null ||
                this.notifyManager == null) {
                return;
            }
            notifyId = (typeof(notifyId)==‘number‘)?notifyId:defaultNotifyId;
            title = title || ‘正在下载‘;
            content = content || ‘正在下载‘;
            tickerTips = tickerTips || ‘进度提示‘;
            //          tickerTips = tickerTips || defaultTicker;
            this.mNotificationBuild.setContentTitle(title);
            this.mNotificationBuild.setContentText(content);
            this.mNotificationBuild.setTicker(tickerTips);
            //进度条显示时,默认无声音
            this.mNotificationBuild.setDefaults(0);
            this.mNotificationBuild.setProgress(100, progress, false);
            this.notifyManager.notify(notifyId, this.mNotificationBuild.build());
        };
        /**
         * @description 完成进度条
         * @param {String} title 标题
         * @param {String} content  内容
         * @param {String} tickerTips  提示
         * @param {Number} notifyId id,默认为1000
         */
        NotificationCustom.prototype.compProgressNotification = function(title, content, tickerTips,notifyId) {
            if (this.mNotificationBuild == null ||
                this.notifyManager == null) {
                return;
            }
            notifyId = (typeof(notifyId)==‘number‘)?notifyId:defaultNotifyId;
            title = title || ‘进度条显示完毕‘;
            content = content || ‘进度条显示完毕‘;
            tickerTips = tickerTips || ‘进度提示‘;
            this.mNotificationBuild.setContentTitle(title);
            this.mNotificationBuild.setContentText(content);
            this.mNotificationBuild.setTicker(tickerTips);
            this.mNotificationBuild.setProgress(0, 0, false);
            //默认有声音
            this.mNotificationBuild.setDefaults(plus.android.importClass("android.app.Notification").DEFAULT_SOUND);
            this.notifyManager.notify(notifyId, this.mNotificationBuild.build());
        };
        /**
         * @description 清除通知栏信息
         * @param {Number} notifyId id,默认为1000
         */
        NotificationCustom.prototype.clearNotification = function(notifyId) {
            notifyId = (typeof(notifyId)==‘number‘)?notifyId:defaultNotifyId;
            if(this.notifyManager){
                this.notifyManager.cancel(notifyId);
            }
        };
        /**
         * @description 清除所有通知栏信息
         */
        NotificationCustom.prototype.clearAllNotification = function() {
            if(this.notifyManager){
                this.notifyManager.cancelAll();
            }
        };
        obj.plusReady(function() {
            obj.NotificationUtil = new NotificationCustom();
        });
    })();

})(window.NjsPhoneApi = {});

调用方法示例:
显示普通通知:

NjsPhoneApi.NotificationUtil.setNotification(‘测试标题‘+staticI,‘测试内容‘);

显示进度条代码:

function testProgress() {
        //插件调用
        NjsPhoneApi.NotificationUtil.setNotification("新版下载", "开始下载");
        var current = 0;
        NjsPhoneApi.NotificationUtil.setProgress(current); //插件调用
        function progress() {
            setTimeout(function() {
                current += 1;
                NjsPhoneApi.NotificationUtil.setProgress(current);
                if(current>=100){
                     NjsPhoneApi.NotificationUtil.compProgressNotification("下载完成");
                }else{
                    progress();
                }
            }, 100);
        };
        progress();
    };
testProgress();//调用显示进度条

取消单条通知:(传入参数为id,不传采用默认id)

NjsPhoneApi.NotificationUtil.clearNotification();

取消所有通知:

NjsPhoneApi.NotificationUtil.clearAllNotification();

另外: 支持自定义id的通知,也就是说可以通过传入不同的id,同时显示不同的通知

效果图1:
效果图2:
示例源码:鉴于有一些朋友会有各式各样的奇怪错误,所以这里单独写了一个示例,测试了android机型(华为,联想)都是可以正常使用的.
示例源码中采用的是默认id

时间: 2024-10-10 18:27:48

一个Notification 进度条插件(android,NJS实现,直接就可使用)的相关文章

HTML5简单进度条插件

今天学习了HTML5画线条,于是有了做一个简单进度条的插件的想法 先来一个实例 下面是html代码 <div> <canvas id="canvas"></canvas> </div> 然后js配置参数 var setting = { id: "canvas",//画布id 不可省略 width: 40,//进度条高度 可省略 time: 100,//进度刷新时间间隔 可省略 默认为1000毫秒 color: &quo

Html5添加SVG的轻量级jQuery进度条插件教程

一.使用方法 使用该jQuery进度条插件需要引入jQuery和jquery.progress.js文件. <script src="js/jquery.min.js"></script> <script src="js/jquery.progress.js"></script> 二.Html结构 该jQuery进度条的HTML结构使用一个<svg>元素来制作. <svg id="conta

Jquery进度条插件 Progress Bar插件应用方法

搞的我小纠结了一会,最后感谢同事分享文章,得以结局,呵呵,小经验还是要保存的个人使用总结: <script type="text/ 网页特效" src="/Scripts/jquery-1.4.4.min.js"></script> <script type="text/javascript" src="/Scripts/Method/jquery.progressbar.min.js">&

HTML5圆形百分比进度条插件circleChart(记录)

介绍:一款可以描绘圆圈进度条的jQuery插件(可用作统计图) circleChart使用方法 在页面中引入jquery和circleChart.min.js文件. <script src="path/to/jquery.min.js"></script> <script src="path/to/circleChart.min.js"></script> HTML结构 使用一个<div>元素作为该圆形百分

简单的jquery进度条插件LineProgressbar.js

参考   http://www.lanrenzhijia.com/jquery/4121.html demo下载 <script src="js/jquery.lineProgressbar.js" type="text/javascript"></script> $(function(){ $('#progressbar1').LineProgressbar({ percentage: 50 }); $('#progressbar2').L

CSS3和js谷歌Material Design进度条插件

mprogress是一款使用纯JS和CSS3制作的谷歌Material Design样式的进度条插件.该插件没有依赖任何外部库.它可以制作4种类型的进度条动画,使用扁平化设计,非常时尚. 该进度条插件有4种类型的动画方式,分别是:确定型.缓冲型.不确定型和查询确定型. mprogress是移动设备优先的js插件,?所有类型的进度条都可以工作在Chrome 和 Firefox浏览器上.Determinate类型的进度条可以工作在所有浏览器上. 在线演示:http://www.htmleaf.com

jQuery简单实用的轻量级进度条插件

jQMeter是一款简单实用的轻量级进度条jQuery插件,它可以显示为水平或垂直进度条,进度条加载时带有动画特效,你只需要简单的传入一些参数到jQMeter对象的构造函数中就可以完成你想要的进度条效果. 该进度条插件的构造函数中允许你定义进度条的宽度.高度.背景色.进度条颜色等等参数,通过这些参数你可以构造自己的进度条样式. 效果演示:http://www.htmleaf.com/Demo/201504131672.html 下载地址:http://www.htmleaf.com/jQuery

jQuery彩色条纹进度条插件

这是一款效果非常炫酷时尚的jQuery彩色条纹进度条插件.该进度条插件可以定制多种颜色,并且可以定制是否显示进度条动画.进度条可以是彩带模式,也可以使纯色模式. 该jq进度条插件最大的特点是进度条进入视口时才开始产生动画,效果非常好. 该进度条jquery插件使用了Flat UI Color Scheme来生成进度条的配色方案.如果你使用的颜色的class没有被提供,将会显示为灰色. 在线演示:http://www.htmleaf.com/Demo/201502031322.html 下载地址:

基于Jquery的音乐播放器进度条插件

自己基于豆瓣FM的ui仿写qq音乐时,基于Jquery手写的进度条插件,效果图如下: 主要特色: ① 可自适应挂载元素的宽度,也可以自己设置进度条宽度: ② 支持部分默认参数修改(具体见使用说明): ③ 允许最大时间为23:59:59,高于此值将默认修改为此值: ④ 可以自己控制进度条动画的开关及重置: ⑤ 可以获取进度条当前时间和宽度,与H5的audio标签协调使用. 使用说明: /* * 功能描述:播放器进度条 * 参数: * option:挂载父元素 * inTime:进度条时间长度 *