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 解压并指定…

给控件添加小图标

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

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

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

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

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

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;最后结果都不尽人意。非常规写法上传文件上传给真正的用于…

08-spring学习-annotation配置

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

Android 6.0 源代码编译实践

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

RNN介绍,较易懂

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

php生成图片水印,PHP生成图片加文字及图案水印办法

工作中&#xff0c;各种语言都要会&#xff0c;但不是各种语言都记到脑子里&#xff0c;常常要查字典、查手册、以及百度对于PHP生成图片加文字及图案水印这项技巧&#xff0c;好久没有用&#xff0c;又有些生疏了&#xff0c;现在来温故知新&#xff0c;加深记忆&#xff01;代…

易飞扬宣布完成100G CWDM4PSM4光模块量产线建设

讯&#xff0c;易飞扬即日宣布量产两款高性能的100G光模块&#xff1a;100G QSFP28 CWDM4 和100G QSFP28 PSM4。两种产品采用同一个技术平台和生产平台。本次建设投产的CWDM4/PSM4 车间为万级无尘恒温恒湿车间&#xff0c;面积2000平米&#xff0c;配置有3套全自动高精密WIRE B…

滑动切换activity

一、效果 手在屏幕上划过一段距离&#xff0c;切换页面。 二、原理 2.1手在屏幕上出发 onTouch事件 2.2在onTouch事件中完成滑动逻辑处理 2.2.1 判断划过的x轴距离&#xff0c;如果大于多少&#xff0c;则startActivtiy 2.2.2 判断划过的y轴距离&#xff0c;如果大于多少&a…

Redux的全家桶与最佳实践

2019独角兽企业重金招聘Python工程师标准>>> image.png Redux 的第一次代码提交是在 2015 年 5 月底&#xff08;也就是一年多前的样子&#xff09;&#xff0c;那个时候 React 的最佳实践还不是明晰&#xff0c;作为一个 View 层&#xff0c;有人会用 backbone 甚至…

php二分查找算法时间复杂度,一个运用二分查找算法的程序的时间复杂度是什么...

一个运用二分查找算法的程序的时间复杂度是“对数级别”。二分查找是一种效率较高的查找方法&#xff0c;算法复杂度即是while循环的次数&#xff0c;时间复杂度可以表示“O(h)O(log2n)”。本教程操作环境&#xff1a;windows7系统、Dell G3电脑。一个运用二分查找算法的程序的…

将不确定变为确定~头压缩是否有必要,MVC如何实现头压缩

网页的头部压缩在页面体积大的情况下非常有必要做&#xff0c;它会使页面体积有一个明显的减小&#xff0c;同时加到网页从服务端下载到客户端的速度&#xff0c;以下是我做的一个测试&#xff1a; 没有使用头压缩时&#xff1a; 使用了头压缩后&#xff1a; 我们可以看到&…

android .9.png ”点九” 图片制作方法

“点九”是andriod平台的应用软件开发里的一种特殊的图片形式&#xff0c;文件扩展名为&#xff1a;.9.png 智能手机中有自动横屏的功能,同一幅界面会在随着手机(或平板电脑)中的方向传感器的参数不同而改变显示的方向,在界面改变方向后,界面上的图形会因为长宽的变化而产生拉伸…

深入理解HTTP Session

session在web开发中是一个非常重要的概念&#xff0c;这个概念很抽象&#xff0c;很难定义&#xff0c;也是最让人迷惑的一个名词&#xff0c;也是最多被滥用的名字之一&#xff0c;在不同的场合&#xff0c;session一次的含义也很不相同。这里只探讨HTTP Session。为了说明问题…

Linux访问其他进程空间,Linux环境进程间通信系列(五):共享内存

共享内存可以说是最有用的进程间通信方式&#xff0c;也是最快的IPC形式。两个不同进程A、B共享内存的意思是&#xff0c;同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新&#xff0c;反之亦然。由于多个进程共享同一块内存区…

冲刺NO.8

Alpha冲刺第八天 站立式会议 项目进展 项目稳步进行&#xff0c;项目的基础部分如基本信息管理&#xff0c;信用信息管理等部分已相对比较完善。 问题困难 技术困难在短期内很难发生质的变化&#xff0c;而本项目由于选择了队员不太熟悉的程序框架&#xff0c;所以所以项目的交…

linux由众多微内核组成,什么是linux

大家对Linux这个词比较陌生吧&#xff0c;那么Linux是什么呢&#xff1f;Linux是什么Linux是一种自由和开放源码的类Unix操作系统。目前存在着许多不同的Linux&#xff0c;但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中&#xff0c;从手机、平板电脑、路由器和视…