Android应用App更新实例详解
程序员文章站
2023-11-02 20:55:22
前言:现在一般的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; } }
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!