Android应用检查更新下载安装打开

一、效果

低版本1.02


检测到新版本1.03

调用android的安装activity页面



安装完成



打开

1.03版本


二、注意

必须使用签名的应用。因为android不管是虚拟机还是真机安装应用都需要签名。

在开发时,我们运行程序时,开发环境ADT会自动给我们加入一个默认的开发签名,所以我们不需要手动导出签名应用。

三、步骤

1、编写更新文件update.json

2、编写更新代码

3、导出低版本签名应用(1.02)

4、adb命令安装低版本签名应用

5、导出高版本签名应用(1.03),放到tomcat服务器上

6、自动更新安装升级

四、各步骤详情

4.1编写更新文件update.json

{
"versonName":"1.03",
"versonCode":3,
"description":"新增了很多功能,更新体验吧!",
"downloadUrl":"http://10.0.2.2:8080/android/ZMGMobileSafe1.03.apk"
}

4.2编写更新代码

检查更新的功能
/***检查是否有新的版本*/private void checkNewVersion(){new Thread(){public void run() {long startTime=System.currentTimeMillis();//Android推荐使用,这个方法会先检测是否存在message实例,如果存在直接用,如果没有存在则new一个。//Android系统默认有10个实例Message msg=Message.obtain();String url="http://10.0.2.2:8080/android/update.json";try {//访问服务器获取jsonString result=HttpConnectionUtils.get(url);//解析json字符串JSONObject js=new JSONObject(result);mVersonName = js.getString("versonName");mVersonCode = js.getInt("versonCode");mDescription = js.getString("description");mDownloadUrl = js.getString("downloadUrl");//比较服务器版本号和应用的版本号if(mVersonCode>getVersionCode()){msg.what=CODE_UPDATE_DIALOG;}else{msg.what =CODE_ENTER_HOME;}} catch (MalformedURLException e) {//url格式错误msg.what=CODE_URL_ERROR;e.printStackTrace();} catch (IOException e) {//网络异常msg.what=CODE_NET_ERROR;e.printStackTrace();}catch (JSONException e) {//json格式错误msg.what=CODE_JSON_ERROR;e.printStackTrace();}finally{//不能让闪屏页太快闪过去,强制等待long endTime=System.currentTimeMillis();long usedTime=endTime-startTime;if(usedTime<3000){try {Thread.sleep(3000-usedTime);} catch (InterruptedException e) {e.printStackTrace();}}mHandler.sendMessage(msg);}}}.start();}

HttpConnectionUtils.java
/*** http-get的方式获取数据* @param url 访问地址* @return 字符串* @throws MalformedURLException */public static String get(String url) throws MalformedURLException,IOException{String result="";//MalformedURLException 不正确的url地址异常URL connUrl=new URL(url);HttpURLConnection conn=(HttpURLConnection) connUrl.openConnection();conn.setRequestMethod("GET");conn.setConnectTimeout(5000);//设置连接超时,如果5秒连不上,就不连接了,抛IOExceptionconn.setReadTimeout(5000);//设置读取超时,虽然连接上了,但是服务器5秒了还不给反应,也就不等了,抛IOExceptionconn.connect();int responseCode=conn.getResponseCode();if(responseCode==HttpURLConnection.HTTP_OK){//读取响应头里的输入流InputStream ins=conn.getInputStream();result=StreamUtils.readFromStream(ins);}if(conn!=null){conn.disconnect();}return result;}

private void ShowUpdateDialog(){AlertDialog.Builder builder=new AlertDialog.Builder(this);builder.setTitle(getText(R.string.updateTitle)+mVersonName);builder.setMessage(mDescription);//设置当点击退回键的时候,对话框不关闭builder.setCancelable(false);//设置确定按钮的点击事件builder.setPositiveButton("立即升级", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {System.out.println("点击了立即升级");downLoad();}});builder.setNegativeButton("以后再说", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {enterHome();}});//用户点击返回键时触发,点击了返回键则进入主界面builder.setOnCancelListener(new OnCancelListener() {@Overridepublic void onCancel(DialogInterface dialog) {enterHome();}});//这句话不能忘记哦,是把对话框显示出来builder.show();}


代码中用到了xUtils框架的httpUtils模块下载功能
private void downLoad() {//检查SD卡是否准备好了if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){tvProgress.setVisibility(View.VISIBLE);//显示进度条String target=Environment.getExternalStorageDirectory()+"/safeUpdate.apk";//xUtilsHttpUtils utils=new HttpUtils();utils.download(mDownloadUrl, target, new RequestCallBack<File>() {@Overridepublic void onLoading(long total, long current,boolean isUploading) {super.onLoading(total, current, isUploading);tvProgress.setText("下载进度:"+current/total*100+"%");}@Overridepublic void onSuccess(ResponseInfo<File> responseInfo) {/** 调用系统的安装activity<activity android:name=".PackageInstallerActivity"android:configChanges="orientation|keyboardHidden"android:theme="@style/Theme.Transparent"><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><data android:scheme="content" /><data android:scheme="file" /><data android:mimeType="application/vnd.android.package-archive" /></intent-filter></activity>*/Intent intent=new Intent();intent.setAction(Intent.ACTION_VIEW);intent.addCategory(Intent.CATEGORY_DEFAULT);intent.setDataAndType(Uri.fromFile(responseInfo.result), "application/vnd.android.package-archive");//startActivity(intent);//当用户点击了取消安装,会返回结果,回调方法onActivityResultstartActivityForResult(intent, 0);//安装完成后,提示完成、打开android.os.Process.killProcess(android.os.Process.myPid());}@Overridepublic void onFailure(HttpException error, String msg) {Toast.makeText(SplashActivity.this, "下载失败!", Toast.LENGTH_SHORT).show();}});}else{Toast.makeText(this, "没有找到SD卡", Toast.LENGTH_SHORT).show();}}

下载完成了安装时,调用android系统的activity页面,会显示安装页面,有取消和安装两个按钮。
/** 调用系统的安装activity<activity android:name=".PackageInstallerActivity"android:configChanges="orientation|keyboardHidden"android:theme="@style/Theme.Transparent"><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><data android:scheme="content" /><data android:scheme="file" /><data android:mimeType="application/vnd.android.package-archive" /></intent-filter></activity>*/Intent intent=new Intent();intent.setAction(Intent.ACTION_VIEW);intent.addCategory(Intent.CATEGORY_DEFAULT);intent.setDataAndType(Uri.fromFile(responseInfo.result), "application/vnd.android.package-archive");//startActivity(intent);//当用户点击了取消安装,会返回结果,回调方法onActivityResultstartActivityForResult(intent, 0);//安装完成后,提示完成、打开android.os.Process.killProcess(android.os.Process.myPid());

4.3,4 导出签名应用

修改AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.zengmg.MobileSafe"android:versionCode="2"android:versionName="1.02">

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.zengmg.MobileSafe"android:versionCode="3"android:versionName="1.03">


具体导出步骤见博文:http://blog.csdn.net/zengmingen/article/details/49761469

4.6 安装

如果报错可能是签名不一致问题

见博文:http://blog.csdn.net/zengmingen/article/details/49760359


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/539950.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lnmp解析php,搭建LNMP,可以解析PHP文件-Go语言中文社区

一、安装 nginx1. yum -y install pcre-devel zlib-devel links 下载相应软件可以使用rpm -qa 软件名 来查看是否安装成功??2.useradd -u 250 -M -s /sbin/nologin nginx 建立程序用户&#xff0c;降低权限3.tar xf nginx-1.6.0.tar.gz -C /usr/src/nginx 解压并指定…

Linux vi 编辑器常见命令的使用

Linux vi 编辑器常见命令的使用 Linux下的文本编辑器有很多种&#xff0c;vi 是最常用的&#xff0c;也是各版本Linux的标配。注意&#xff0c;vi 仅仅是一个文本编辑器&#xff0c;可以给字符着色&#xff0c;可以自动补全&#xff0c;但是不像 Windows 下的 word 有排版功能。…

给控件添加小图标

一、效果 二、知识点 三、代码 <TextViewstyle"style/ContentStyle"android:drawableLeft"android:drawable/star_big_on"android:gravity"center"android:text"远程锁屏:#*lockscreen*#" />

加速计算,为何会成为 AI 时代的计算力“新宠”

随着科技的发展&#xff0c;处理大量数据和进行复杂计算的需求越来越高&#xff0c;人工智能、大数据和物联网等领域更是如此&#xff0c;传统的计算方式已经无法满足这些需求。因此&#xff0c;加速计算作为一种现代计算方式&#xff0c;成了必要的手段。加速计算具有前所未有…

Java中nextfloat怎么用,关于java的nextFloat()后面跟一个nextLine()

ArrayList studentInfors new ArrayList();Scanner sc new Scanner(System.in);for (int i 0; i StudentInfor studentInfor new StudentInfor();System.out.print("请输入学生学号&#xff1a;");studentInfor.setNum(sc.nextLine());System.out.print("请…

背景选择器selector替换按钮默认背景

一、效果 正常状态 获取焦点或按下 按钮的背景图片是.9图&#xff0c;.9图的制作过程&#xff0c;见下面博文 http://blog.csdn.net/zengmingen/article/details/50193245 二、步骤 模仿android自带的按钮控件编写1、找到android自带按钮的样式。D:\ADT\sdk\platforms\andro…

php 取数值整数的函数是,PHP取整数函数常用的四种方法小结

ceil — 进一法取整说明float ceil ( float value )返回不小于 value 的下一个整数&#xff0c;value 如果有小数部分则进一位。ceil() 返回的类型仍然是 float&#xff0c;因为 float 值的范围通常比 integer 要大。例子 1. ceil() 例子echo ceil(4.3); // 5echo ceil(9.999);…

ios 获取控件高度

2019独角兽企业重金招聘Python工程师标准>>> 1.ios 获取控件相对屏幕的位置 需要获取的对象为view1&#xff0c;则该视图相对屏幕的位置可使用下面方法实现&#xff1a; UIWindow * window[[[UIApplication sharedApplication] delegate] window]; CGRect rect[view…

php文件上传前端页面样式,HTML实现美化上传文件样式

这篇文章介绍的内容是HTML实现美化上传文件i样式 &#xff0c;有着一定的参考价值&#xff0c;现在分享给大家&#xff0c;有需要的朋友可以参考一下传统写法上传文件效果如下图所示这个样式调整了很长时间&#xff0c;最后结果都不尽人意。非常规写法上传文件上传给真正的用于…

jquery mobile用代码弹出dialog

一、点击弹出dialog 见http://www.w3school.com.cn/jquerymobile/jquerymobile_pages.asp中“将页面作为dialog”这节二、代码弹出 思路&#xff1a;模拟一个点击事件。1、在页面上隐藏一个<a>,如下 <a id"test" href"#pagetwo" style"displ…

毕设开发日志2017-12-01-Scan超时

【前言】 本篇博客主要描述一下在开发过程中遇到的scan的超时问题。 【问题描述】 刚刚完成了对索引表的定义和建议&#xff0c;并且在单元测试中对该表进行插入和扫描时均未发现错误。但是在对该表进行整体更新时&#xff0c;需要在扫描weather表的过程中对该表进行不断的更新…

ubuntu java 1.6 安装,ubuntu 中安装java jdk 1.6

--------------------------------------------------------------------------------------------本文系本站原创,欢迎转载!转载请注明出处:http://blog.csdn.net/gdt_a20/article/details/7307681-------------------------------------------------------------------------…

Oracle修改表结构字段名和字段长度

添加字段的语法&#xff1a;alter table tablename add (column datatype [default value][null/not null],….); 修改字段的语法&#xff1a;alter table tablename modify (column datatype [default value][null/not null],….); 删除字段的语法&#xff1a;alter table tab…

php快速排序实现代码,快速排序的算法php实现

function qsort(&$arr){_quick_sort($arr, 0, count($arr) - 1);}/*** 采用递归算法的快速排序。** param array $arr 要排序的数组* param int $low 最低的排序子段* param int $high 最高的排序字段*/function _quick_sort(&$arr, $low, $high){$low_data $arr[$low…

08-spring学习-annotation配置

利用annotation配置注入关系 为了更好的解释此类存在的意义&#xff0c;下面通过一段习惯性的开发进行问题的描述&#xff0c;例如&#xff1a; 现在有一个IAdminService服务层&#xff0c;这个服务层要调用的是IAdminDAO和IRoleDAO两个数据层操作&#xff0c;于是定义如下&…

JQuery 绑定select标签的onchange事件

原文出处&#xff1a;http://blog.csdn.net/a5489888/article/details/20045175 使用jqm的change事件 <script src"jquery.min.js" type"text/javascript"></script> <script language"javascript" type"text/javascript&q…

Android 6.0 源代码编译实践

前阵子去上海参加 Android 开发面试&#xff0c;被问及了 Android 的基本原理、常用组件背后的实现机制、设计模式等问题&#xff0c;我都回答地不好。面试时&#xff0c;老司机们常常问我对知识点“背后的实现代码有没有看&#xff1f;”。于是我就想着&#xff0c;回来要把 A…

php 链接远程oracle,PHP连接远程oracle输出数据

远程连接的连接字符串可以这样写oledbconnection 的连接字符串:providermsdaora;host192.168.1.1;data sourcemytest;user idsystem;passwordxxxprovider msdaora; 指明oledb 的提供者是oracle数据库host 是远程 oracle 数据库所在服务器的ip地址&#xff0c;如果端口不是默认…

RNN介绍,较易懂

人类并不是每时每刻都从一片空白的大脑开始他们的思考。在你阅读这篇文章时候&#xff0c;你都是基于自己已经拥有的对先前所见词的理解来推断当前词的真实含义。我们不会将所有的东西都全部丢弃&#xff0c;然后用空白的大脑进行思考。我们的思想拥有持久性。 传统的神经网络并…

android虚拟机鼠标左键拖动会输入C

不知道什么原因&#xff0c;突然出现这个情况&#xff0c;以为是虚拟机坏了。于是删了&#xff0c;新建&#xff0c;问题还是存在。 问题原因&#xff1a; 后来发现&#xff0c;原来是今天开了有道词典&#xff0c;又开启了词典的划词翻译。 解决方法&#xff1a; 关闭划词翻译…