欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android应用App更新实例详解

程序员文章站 2023-11-02 20:55:22
前言:现在一般的android软件都是需要不断更新的,当你打开某个app的时候,如果有新的版本,它会提示你有新版本需要更新。该项目实现的就是这个功能。并且有强制更新和更新提...

前言:现在一般的android软件都是需要不断更新的,当你打开某个app的时候,如果有新的版本,它会提示你有新版本需要更新。该项目实现的就是这个功能。并且有强制更新和更新提示两种方式,当有更新时,会弹出一个提示框,点击下载,则在通知来创建一个进度条进行下载,点击取消,则取消更新。

效果:

 Android应用App更新实例详解

开发环境:androidstudio2.1.2+gradle-2.10

部分代码:

public class updateversioncontroller {
 private context context;
 //更新文件的实例
 private appupdateinfo info;
 //当前版本号
 private int versioncode;
 //提示用户更新的dialog
 private dialog dialog;
 //下载进度条
 private progressdialog pd;

 public static updateversioncontroller getinstance(context context) {
 return new updateversioncontroller(context);
 }
 public updateversioncontroller(context context) {
 this.context = context;
 }
 public void normalcheckupdateinfo() {
 //获取版本号:这里的版本号在项目的build.gradle中是可以看到的,看复制过来的参数
 /**
 defaultconfig {
 applicationid "com.zhh.test"
 minsdkversion 16
 targetsdkversion 23
 versioncode 1
 versionname "1.0"
 }
 */
 versioncode = getvercode(context);//等于19
 checkversiontask();
 }
 public void forcecheckupdateinfo() {//强制更新一般不用
 versioncode = getvercode(context);//等于19
 info = new appupdateinfo();
 info.seturl("http://60.210.21.89/appdl.hicloud.com/dl/appdl/application/apk/dd/ddeabc7e64d64e4287340ffb89c592a8/com.hellotext.1309171635.apk?sign=baidu@baidu&wshc_tag=0&wsts_tag=58c7bde2&wsid_tag=7c5a47c8&wsiphost=ipdbm");
 info.setvercode(2);//每次更新都靠它
 info.setvername("2.0");//版本名字
 info.setapkname("com.hellotext.1309171635.apk");
 info.setappname("hello");
 info.setforceupp("yes");
 info.setuppcontent("1. hello啊哟更新了\n2. 英文的,界面很好看.\n3. 界面效果优化");//更新内容
 updateapp();
 }
 /**
 * 步骤一:获取版本信息
 */
 private void checkversiontask() {
 //网络加载获取app新版版本信息
 //这里不做请求直接赋值
 info = new appupdateinfo();
 info.seturl("http://60.210.21.89/appdl.hicloud.com/dl/appdl/application/apk/dd/ddeabc7e64d64e4287340ffb89c592a8/"+
            "com.hellotext.1309171635.apk?sign=baidu@baidu&wshc_tag=0&wsts_tag=58c7bde2&wsid_tag=7c5a47c8&wsiphost=ipdbm");
 info.setvercode(2);//每次更新都靠它
 info.setvername("2.0");//版本名字
 info.setapkname("com.hellotext.1309171635.apk");
 info.setappname("hello");
 info.setforceupp("no");
 info.setuppcontent("1. hello啊哟更新了\n2. 英文的,界面很好看.\n3. 界面效果优化");//更新内容
 updateapp();
 }
 private void updateapp() {
 if (null != info && info.getvercode() > versioncode) {//20>19可更新
 showupdatadialog();
 } else {
 toast.maketext(context, "已经是最新版本啦~", toast.length_short).show();
 }
 }
 private button cancelbtn;
 /**
 * 步骤二:弹出对话框提示用户更新
 */
 protected void showupdatadialog() {
 dialog = new dialog(context, android.r.style.theme_dialog);
 dialog.getwindow().setbackgrounddrawableresource(android.r.color.transparent);
 dialog.setcontentview(r.layout.activity_updater);
 dialog.setcanceledontouchoutside(false);
 dialog.setcancelable(false);
 ((textview) dialog.findviewbyid(r.id.content)).settext(info.getuppcontent());
 cancelbtn = (button) dialog.findviewbyid(r.id.cancel);
 cancelbtn.setvisibility("yes".equals(info.getforceupp()) ? view.gone : view.visible);
 // 取消更新
 cancelbtn.setonclicklistener(new view.onclicklistener() {
 @override
 public void onclick(view v) {
 dialog.dismiss();
 }
 });
 // 确认更新
 dialog.findviewbyid(r.id.ok).setonclicklistener(new view.onclicklistener() {
 @override
 public void onclick(view v) {
 dialog.dismiss();
 downloadapk();
 }
 });
 dialog.findviewbyid(r.id.market).setonclicklistener(new view.onclicklistener() {
 @override
 public void onclick(view v) {
 intent intent = new intent(intent.action_view);
 intent.setdata(uri.parse("market://details?id=hello"));
 context.startactivity(intent);
 }
 });
 dialog.show();
 }
 /**
 * 步骤三:下载文件
 */
 private void downloadapk() {
 // 进度条对话框
 pd = new progressdialog(context);
 pd.setprogressstyle(progressdialog.style_horizontal);
 pd.setmessage("下载中...");
 pd.setcanceledontouchoutside(false);
 pd.setcancelable(false);
 // 监听返回键--防止下载的时候点击返回
 pd.setonkeylistener(new onkeylistener() {
 @override
 public boolean onkey(dialoginterface dialog, int keycode, keyevent event) {
 if (keycode == keyevent.keycode_back && event.getrepeatcount() == 0) {
 toast.maketext(context, "正在下载请稍后", toast.length_short).show();
 return true;
 } else {
 return false;
 }
 }
 });
 // sdcard不可用
 if (!environment.getexternalstoragestate().equals(environment.media_mounted)) {
 toast.maketext(context, "sd卡不可用~", toast.length_short).show();
 } else {
 pd.show();
 //下载的子线程
 new thread() {
 @override
 public void run() {
 try {
 // 在子线程中下载apk文件
 file file = getfilefromserver(info.geturl(), pd);
 sleep(1000);
 // 安装apk文件
 installapk(file);
 pd.dismiss(); // 结束掉进度条对话框
 } catch (exception e) {
 toast.maketext(context, "文件下载失败了~", toast.length_short).show();
 pd.dismiss();
 e.printstacktrace();
 }
 }
 }.start();
 }
 }
 /**
 * 从服务器下载apk
 */
 public file getfilefromserver(string path, progressdialog pd) throws exception {
 // 如果相等的话表示当前的sdcard挂载在手机上并且是可用的
 if (environment.getexternalstoragestate().equals(
 environment.media_mounted)) {
 url url = new url(path);
 httpurlconnection conn = (httpurlconnection) url.openconnection();
 conn.setconnecttimeout(5000);
 // 获取到文件的大小
 pd.setmax(conn.getcontentlength() / 1024);
 inputstream is = conn.getinputstream();

 file file = new file(environment.getexternalstoragedirectory().getpath()
 + "/blibao/merchant", "i_blibao_shop.apk");
 //判断文件夹是否被创建
 if (!file.getparentfile().exists()) {
 file.getparentfile().mkdirs();
 }
 fileoutputstream fos = new fileoutputstream(file);
 bufferedinputstream bis = new bufferedinputstream(is);
 byte[] buffer = new byte[1024];
 int len;
 int total = 0;
 while ((len = bis.read(buffer)) != -1) {
 fos.write(buffer, 0, len);
 total += len;
 // 获取当前下载量
 pd.setprogress(total / 1024);
 }
 fos.close();
 bis.close();
 is.close();
 return file;
 } else {
 return null;
 }
 }
 /**
 * 安装apk
 */
 protected void installapk(file file) {
 intent intent = new intent();
 // 执行动作
 intent.setaction(intent.action_view);
 // 执行的数据类型
 intent.setdataandtype(uri.fromfile(file), "application/vnd.android.package-archive");
 intent.addflags(intent.flag_activity_new_task);
 context.startactivity(intent);
 }
 /**
 * 获取版本名
 */
 public static string getvername(context context) {
 string vername = "";
 try {
 // 获取packagemanager的实例
 packagemanager packagemanager = context.getpackagemanager();
 // getpackagename()是你当前类的包名,0代表是获取版本信息
 packageinfo packinfo = packagemanager.getpackageinfo(
 context.getpackagename(), 0);

 vername = packinfo.versionname;
 } catch (exception e) {
 e.printstacktrace();
 }
 return vername;
 }
 /**
 * 获取版本号
 */
 public static int getvercode(context context) {
 int vercode = -1;
 try {
 // 获取packagemanager的实例
 packagemanager packagemanager = context.getpackagemanager();
 // getpackagename()是你当前类的包名,0代表是获取版本信息
 packageinfo packinfo = packagemanager.getpackageinfo(
 context.getpackagename(), 0);

 vercode = packinfo.versioncode;
 } catch (exception e) {
 e.printstacktrace();
 }
 return vercode;
 }
}

 源码下载

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!