博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android程序版本更新--通知栏更新下载安装(转)
阅读量:6651 次
发布时间:2019-06-25

本文共 4383 字,大约阅读时间需要 14 分钟。

Android应用检查版本更新后,在通知栏下载,更新下载进度,下载完成自动安装,效果图如下:

  • 检查当前版本号

AndroidManifest文件中的versionCode用来标识版本,在服务器放一个新版本的apk,versioncode大于当前版本,下面代码用来获取versioncode的值

PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);int localVersion = packageInfo.versionCode;

用当前versioncode和服务端比较,如果小于,就进行版本更新

  • 下载apk文件
/**   * 下载apk   *    * @param apkUri   */ private void downLoadNewApk(String apkUri, String version) {        manager = (NotificationManager) context                .getSystemService((context.NOTIFICATION_SERVICE));        notify = new Notification();        notify.icon = R.drawable.ic_launcher;        // 通知栏显示所用到的布局文件        notify.contentView = new RemoteViews(context.getPackageName(),                R.layout.view_notify_item);        manager.notify(100, notify);        //建立下载的apk文件      File fileInstall = FileOperate.mkdirSdcardFile("downLoad", APK_NAME                + version + ".apk");        downLoadSchedule(apkUri, completeHandler, context,                fileInstall);    }
FileOperate是自己写的文件工具类

通知栏显示的布局,view_notify_item.xml

/**     * 连接网络,下载一个文件,并传回进度     *      * @param uri     * @param handler     * @param context     * @param file     */ public static void downLoadSchedule(final String uri,            final Handler handler, Context context, final File file) {        if (!file.exists()) {            handler.sendEmptyMessage(-1);            return;        }        // 每次读取文件的长度        final int perLength = 4096;        new Thread() {            @Override            public void run() {                super.run();                try {                    URL url = new URL(uri);                    HttpURLConnection conn = (HttpURLConnection) url                            .openConnection();                    conn.setDoInput(true);                    conn.connect();                    InputStream in = conn.getInputStream();                    // 2865412                    long length = conn.getContentLength();                    // 每次读取1k                    byte[] buffer = new byte[perLength];                    int len = -1;                    FileOutputStream out = new FileOutputStream(file);                    int temp = 0;                    while ((len = in.read(buffer)) != -1) {                        // 写入文件                        out.write(buffer, 0, len);                        // 当前进度                        int schedule = (int) ((file.length() * 100) / length);                        // 通知更新进度(10,7,4整除才通知,没必要每次都更新进度)                        if (temp != schedule                                && (schedule % 10 == 0 || schedule % 4 == 0 || schedule % 7 == 0)) {                            // 保证同一个数据只发了一次                            temp = schedule;                            handler.sendEmptyMessage(schedule);                        }                    }                    out.flush();                    out.close();                    in.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }.start();    }

handler根据下载进度进行更新

  • 更新通知栏进度条
/**  * 更新通知栏  */  private Handler completeHandler = new Handler() {        public void handleMessage(android.os.Message msg) {            // 更新通知栏            if (msg.what < 100) {                notify.contentView.setTextViewText(                        R.id.notify_updata_values_tv, msg.what + "%");                notify.contentView.setProgressBar(R.id.notify_updata_progress,                        100, msg.what, false);                manager.notify(100, notify);            } else {                notify.contentView.setTextViewText(                        R.id.notify_updata_values_tv, "下载完成");                notify.contentView.setProgressBar(R.id.notify_updata_progress,                        100, msg.what, false);// 清除通知栏                manager.cancel(100);                installApk(fileInstall);            }        };    };

下载完成后调用系统安装。

  • 安装apk
/**  * 安装apk  *   * @param file  */ private void installApk(File file) {        Intent intent = new Intent();        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);        intent.setAction(android.content.Intent.ACTION_VIEW);        intent.setDataAndType(Uri.fromFile(file),                "application/vnd.android.package-archive");        context.startActivity(intent);    }

安装完成搞定

转载地址:http://pfjto.baihongyu.com/

你可能感兴趣的文章
[BZOJ4198][Noi2015]荷马史诗
查看>>
杭电 1155 Bungee Jumping(物理题)
查看>>
单链表倒置算法
查看>>
北京达人2011春装秀
查看>>
[转载] 信息系统项目管理师教程——06 信息化基础知识
查看>>
数据之路 Day9 Pandas包
查看>>
构建第一个Spring Boot2.0应用之Controller(三)
查看>>
oracle物化视图介绍
查看>>
在Eclipse中使用建立使用Gradle做依赖管理的Spring Boot工程
查看>>
js页面跳转常用的几种方式(转)
查看>>
124. Binary Tree Maximum Path Sum
查看>>
Linux ext3 ext4 区别
查看>>
同时调整lv分区的大小(减少一个,增加另一个)
查看>>
ArrayList
查看>>
Node学习2-基础知识/HelloWorld/模块调用/global/process
查看>>
javascript异步执行函数导致的变量变化问题解决思路
查看>>
CentOS 6.5_X64下安装MongoDB数据库
查看>>
【原】mysql 视图
查看>>
微信授权登录
查看>>
Visual Studio Issues
查看>>