Android程序的版本检测与更新.docx
- 文档编号:8677644
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:12
- 大小:25.53KB
Android程序的版本检测与更新.docx
《Android程序的版本检测与更新.docx》由会员分享,可在线阅读,更多相关《Android程序的版本检测与更新.docx(12页珍藏版)》请在冰豆网上搜索。
Android程序的版本检测与更新
Android程序的版本检测与更新
做个网站的安卓客户端,用户安装到自己手机上,如果我出了新版本怎么办呢?
要有版本更新功能。
本来版本检测最好可以自动进行。
但如果每次开启程序,都要先检测一轮,是一种浪费,毕竟版本更新是小概率的事情。
或许可以程序开启的时候,判断一下时间,单日就检测,双日就不检测,或者随机什么的,降低一下检测的频率?
我采取的做法是将检测功能做到了菜单上,用户有需要,就手动打开自己检测一下。
反正我们这个是网站客户端,有版本更新,在网站上发个通告就行了。
版本检测与更新有以下几个关键步骤:
1、检测有无新版本
2、下载新版本
3、安装替换新版本
我处理的方案是
1、在assets文件夹新增一个文件:
ver.cfg,记录版本信息,纯文本格式,内容只有一句话:
Version=1.0
这个会随安装包装到用户的手机上
然后在网站里面,设置一XML文件ver_apk.xml,内容也只有这么一点:
xmlversion="1.0"encoding="utf-8"?
>
检测的时候,就先访问网站的这个XML,得到最新版本号,然后与手机上的ver.cfg文件里记录的进行比对,不同的话就可以认为存在新版本,提示进行更新。
2、下载的话就是直接下载的,我还不知道怎么弄断点续传
3、安装替换,关键在于签名。
就是每个版本的签名要保持一致。
否则新的无法替换旧的,提示安装未完成。
-------------------天气太冷,咯咯咯------------------------------------
这个功能做在菜单上,触发代码如下:
//==========================================================================
//菜单
//==========================================================================
privatestaticfinalStringurlApk="http:
//3g.***.com/tool/***.apk";
privatestaticfinalStringurlVer="http:
//3g.***.com/tool/ver_apk.xml";
@Override
publicbooleanonCreateOptionsMenu(Menumenu){
menu.add(Menu.NONE,Menu.FIRST+1,5,"检测更新").setIcon(
android.R.drawable.ic_menu_upload);
menu.add(Menu.NONE,Menu.FIRST+2,4,"退出").setIcon(android.R.drawable.ic_lock_power_off);
returntrue;
}
@Override
publicbooleanonOptionsItemSelected(MenuItemitem){
switch(item.getItemId()){
caseMenu.FIRST+1:
Toast.makeText(this,"正在检测版本",Toast.LENGTH_LONG).show();
UpdateVeruv=newUpdateVer(urlApk,urlVer,MainActivity.this);
uv.checkVer();
break;
caseMenu.FIRST+2:
confirmExit();
break;
}
returnfalse;
}
检测更新因为代码比较多,写成一个类进行封装
UpdateVer.java
packageandroid.***;
importandroid.app.Activity;
importandroid.app.AlertDialog;
importandroid.app.Dialog;
importandroid.app.ProgressDialog;
importandroid.content.Context;
importandroid.content.DialogInterface;
importandroid.content.Intent;
import.Uri;
importandroid.os.AsyncTask;
importandroid.util.Log;
importandroid.webkit.URLUtil;
importandroid.widget.Toast;
importjava.io.File;
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
import.MalformedURLException;
import.URL;
import.URLConnection;
importjava.util.Properties;
importorg.xml.sax.InputSource;
importjava.text.SimpleDateFormat;
importjava.util.Date;
publicclassUpdateVerextendsActivity{
privatestaticfinalStringTAG="DOWNLOADAPK";
privateStringPastVersion;
privateStringNowVersion;
publicProgressDialogpBar;
privateStringcurrentFilePath="";
privateStringfileEx="";
privateStringfileNa="";
privateStringstrURL="";
privateStringVersionUri="";
privateContextmContext;
privatefinalStringfileVer="ver.cfg";
publicUpdateVer(Stringurlapk,Stringurlver,finalContextcontext){
SimpleDateFormatdf=newSimpleDateFormat("yyyyMMddHHmmss");
Stringver="?
ver="+df.format(newDate());//主要是避开手机的缓存
strURL=urlapk+ver;
VersionUri=urlver+ver;
mContext=context;
}
publicvoidcheckVer(){
//解析Version网页,获取版本号
getVersionxml(VersionUri);
}
privatevoidcompareVer(){
load();
//当有最新版本的时候
if(PastVersion!
=null&&!
PastVersion.equals(NowVersion)){
Dialogdialog=newAlertDialog.Builder(mContext).setTitle("系统更新")
.setMessage(String.format("发现新版本%s,目前版本为%s,请更新!
",NowVersion,PastVersion))//设置内容
//设置确定按钮
.setPositiveButton("确定"
newDialogInterface.OnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,
intwhich){
pBar=newProgressDialog(mContext);
pBar.setTitle("正在下载");
pBar.setMessage("请稍候...");
pBar.setProgressStyle(ProgressDialog.STYLE_SPINNER);
fileEx=strURL.substring(strURL.lastIndexOf(".")+1,strURL.length()).toLowerCase();
fileEx=fileEx.substring(0,fileEx.lastIndexOf("?
"));
fileNa=strURL.substring(strURL.lastIndexOf("/")+1,strURL.lastIndexOf("."));
getFile(strURL);
}
}).setNegativeButton("取消",
newDialogInterface.OnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,
intwhichButton){
//点击"取消"按钮之后退出程序
}
}).create();//创建
//显示对话框
dialog.show();
}
else{
Toast.makeText(mContext,String.format("当前为最新版本%s",PastVersion),Toast.LENGTH_LONG).show();
}
}
privatevoidgetFile(finalStringstrPath)
{
pBar.show();
try{
if(strPath.equals(currentFilePath)){
getDataSource(strPath);
}
currentFilePath=strPath;
Runnabler=newRunnable(){
@Override
publicvoidrun()
{
try{
getDataSource(strPath);
}
catch(Exceptione){
Log.e(TAG,e.getMessage(),e);
}
}
};
newThread(r).start();
}
catch(Exceptione){
e.printStackTrace();
}
}
/*取得远程文件*/
privatevoidgetDataSource(StringstrPath)throwsException{
if(!
URLUtil.isNetworkUrl(strPath)){
Log.d("Tag","error");
}
else{
/*取得URL*/
URLmyURL=newURL(strPath);
/*建立联机*/
URLConnectionconn=myURL.openConnection();
conn.connect();
/*InputStream下载文件*/
InputStreamis=conn.getInputStream();
if(is==null){
Log.d("tag","error");
thrownewRuntimeException("没有读取到文件内容");
}
/*建立临时文件*/
FilemyTempFile=File.createTempFile(fileNa,"."+fileEx);
myTempFile.getAbsolutePath();
/*将文件写入临时盘*/
FileOutputStreamfos=newFileOutputStream(myTempFile);
bytebuf[]=newbyte[128];
do{
intnumread=is.read(buf);
if(numread<=0){
break;
}
fos.write(buf,0,numread);
}while(true);
/*打开文件进行安装*/
openFile(myTempFile);
try{
is.close();
}
catch(Exceptionex){
Log.d("Tag","error");
Log.e(TAG,"error:
"+ex.getMessage(),ex);
}
}
}
/*在手机上打开文件*/
privatevoidopenFile(Filef){
pBar.cancel();
Intentintent=newIntent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(android.content.Intent.ACTION_VIEW);
/*调用getMIMEType()来取得MimeType*/
Stringtype=getMIMEType(f);
/*设定intent的file与MimeType*/
intent.setDataAndType(Uri.fromFile(f),type);
mContext.startActivity(intent);
}
/*判断文件MimeType的method*/
privateStringgetMIMEType(Filef){
Stringtype="";
StringfName=f.getName();
/*取得扩展名*/
Stringend=fName.substring(fName.lastIndexOf(".")+1,fName.length()).toLowerCase();
/*按扩展名的类型决定MimeType*/
if(end.equals("m4a")
||end.equals("mp3")
||end.equals("mid")
||end.equals("xmf")
||end.equals("ogg")
||end.equals("wav")){
type="audio";
}
elseif(end.equals("3gp")||end.equals("mp4")){
type="video";
}
elseif(end.equals("jpg")
||end.equals("gif")
||end.equals("png")
||end.equals("jpeg")
||end.equals("bmp")){
type="image";
}
elseif(end.equals("apk")){
/*android.permission.INSTALL_PACKAGES*/
type="application/vnd.android.package-archive";
}
else{
type="*";
}
/*如果无法直接打开,就跳出软件清单给使用者选择*/
if(!
end.equals("apk")){
type+="/*";
}
returntype;
}
privatevoidgetVersionxml(StringresourceUrl){
GetVergv=newGetVer();
gv.execute(resourceUrl);
}
privatebooleanload(){
Propertiesproperties=newProperties();
try{
InputStreamstream=mContext.getAssets().open(fileVer);
//FileInputStreamstream=mContext.openFileInput(fileVer);
//读取文件内容
properties.load(stream);
}
catch(FileNotFoundExceptione){
returnfalse;
}
catch(IOExceptione){
returnfalse;
}
catch(Exceptione){
returnfalse;
}
PastVersion=String.valueOf(properties.get("Version").toString());
returntrue;
}
//==========================================================================
//GetVer
//==========================================================================
classGetVerextendsAsyncTask
@Override
protectedStringdoInBackground(String...urlVer){
Stringdb=null;
URLurl=null;
try{
url=newURL(urlVer[0]);
}
catch(MalformedURLExceptione){
e.printStackTrace();
}
InputSourceis=null;
try{
is=newInputSource(url.openStream());
is.setEncoding("UTF-8");
db=SAXGetVersionService.readRssXml(is);
}
catch(Exceptione){
e.printStackTrace();
}
returndb;
}
@Override
protectedvoidonCancelled(){
super.onCancelled();
}
@Override
protectedvoidonPostExecute(Stringresult){
NowVersion=result;
compareVer();
}
}
}
AndroidManifest.xml要加上几句
name="android.permission.INTERNET"/> name="android.permission.INSTALL_PACKAGES"/> name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> name="android.permission.WRITE_EXTERNAL_STORAGE"/> name="android.permission.RESTART_PACKAGES"/> name="android.permission.READ_PHONE_STATE"/> name="android.permission.ACCESS_NETWORK_STATE"/> name="android.permission.ACCESS_COARSE_LOCATION"/> name="android.permission.ACCESS_WIFI_STATE"/> 参考文章:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 程序 版本 检测 更新