
Android
1.检测当前版本的信息AndroidManifest.XML--manifest--Android:versionName。
2.从服务器获取版本号(版本号存在于XML文件中)并与当前检测到的版本进行匹配,如果不匹配,提示用户进行升级,如果匹配则进入程序主界面。

XML
二、效果图
三、必要说明
服务器端存储apk文件,同时有version.XML文件便于比对更新。
?XML version=1.0 encoding=utf-8? info version2.0/version urlhttp://192.168.1.187:8080/mobilesafe.apk/url description检测到最新版本,请及时更新!/description url_serverhttp://192.168.1.99/version.XML/url_server /info 通过一个实体类获取上述信息。
package com.Android; public class UpdatAInfo { private String version; private String url; private String description; private String url_server;
public String getUrl_server() { return url_server; } public void setUrl_server(String url_server) { this.url_server = url_server; } public String getVersion() { return version; } public void setVersion(String version) { this.version = version; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } } apk和版本信息地址都放在服务器端的version.XML里比较方便,当然如果服务器端不变动,apk地址可以放在strings.XML里,不过版本号信息是新的,必须放在服务器端,XML地址放在strings.XML。
?XML version=1.0 encoding=utf-8? resources string name=helloHello World, VersionActivity!/string string name=app_nameVersion/string string name=url_serverhttp://192.168.1.99/version.XML/string /resources 不知道读者发现没有,笔者犯了个错误,那就是url_server地址必须放在本地,否则怎么读取version.XML,所以url_server不必在实体类和version里添加,毕竟是现需要version地址也就是url_server,才能够读取version。
三、代码实现
?XML version=1.0 encoding=utf-8? LinearLayout XMLns:Android=http://schemas.Android.com/apk/res/Android Android:layout_width=fill_parent Android:layout_height=fill_parent Android:orientation=vertical Button Android:id=@+id/btn_getVersion Android:text=检查更新 Android:layout_width=wrap_content Android:layout_height=wrap_content/ /LinearLayout package com.Android; import Java.io.InputStream; import org.XMLpull.v1.XMLPullParser; import Android.util.XML; public class UpdatAInfoParser { public static UpdatAInfo getUpdatAInfo(InputStream is) throws Exception{ XMLPullParser parser = XML.newPullParser(); parser.setInput(is, utf-8); int type = parser.getEventType(); UpdatAInfo info = new UpdatAInfo(); while(type != XMLPullParser.END_DOCUMENT ){ switch (type) { case XMLPullParser.START_TAG: if(version.equals(parser.getName())){ info.setVersion(parser.nextText()); }else if (url.equals(parser.getName())){ info.setUrl(parser.nextText()); }else if (description.equals(parser.getName())){ info.setDescription(parser.nextText()); } break; } type = parser.next(); } return info; } } package com.Android; import Java.io.File; import Java.io.InputStream; import Java.net.HttpURLConnection; import Java.net.URL; import Android.app.Activity; import Android.app.AlertDialog; import Android.app.AlertDialog.Builder; import Android.app.ProgressDialog; import Android.content.DialogInterface; import Android.content.Intent; import Android.content.pm.PackageInfo; import Android.content.pm.PackageManager; import Android.net.Uri; import Android.os.Bundle; import Android.os.Environment; import Android.os.Handler; import Android.os.Message; import Android.util.Log; import Android.view.View; import Android.view.View.OnClickListener; import Android.widget.Button; import Android.widget.TextView; import Android.widget.Toast; public class VersionActivity extends Activity { private final String TAG = this.getclass().getName(); private final int UPDATA_NONEED = 0; private final int UPDATA_CLIENT = 1; private final int GET_UNDATAINFO_ERROR = 2; private final int SDCARD_NOMOUNTED = 3; private final int DOWN_ERROR = 4; private Button getVersion; private UpdatAInfo info; private String localVersion; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setcontentView(R.layout.mAIn); getVersion = (Button) findViewById(R.id.btn_getVersion); getVersion.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { try { localVersion = getVersionName(); CheckVersionTask cv = new CheckVersionTask(); new Thread(cv).start(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } private String getVersionName() throws Exception { //getPackageName()是你当前类的包名,0代表是获取版本信息 PackageManager packageManager = getPackageManager(); PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(), 0); return packInfo.versionName; } public class CheckVersionTask implements Runnable { InputStream is; public void run() { try { String path = getResources().getString(R.string.url_server); URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url .openConnection(); conn.setconnectTimeout(5000); conn.setRequestMethod(GET); int responseCode = conn.getResponseCode(); if (responseCode == 200) { // 从服务器获得一个输入流 is = conn.getInputStream(); } info = UpdatAInfoParser.getUpdatAInfo(is); if (info.getVersion().equals(localVersion)) { Log.i(TAG, 版本号相同); Message msg = new Message(); msg.what = UPDATA_NONEED; handler.sendMessage(msg); // LoginMAIn(); } else { Log.i(TAG, 版本号不相同 ); Message msg = new Message(); msg.what = UPDATA_CLIENT; handler.sendMessage(msg); } } catch (Exception e) { Message msg = new Message(); msg.what = GET_UNDATAINFO_ERROR; handler.sendMessage(msg); e.printStackTrace(); } } } Handler handler = new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); switch (msg.what) { case UPDATA_NONEED: Toast.makeText(getApplicationContext(), 不需要更新, Toast.LENGTH_SHORT).show(); case UPDATA_CLIENT: //对话框通知用户升级程序 showUpdataDialog(); break; case GET_UNDATAINFO_ERROR: //服务器超时 Toast.makeText(getApplicationContext(), 获取服务器更新信息失败, 1).show(); break; case DOWN_ERROR: //下载apk失败 Toast.makeText(getApplicationContext(), 下载新版本失败, 1).show(); break; } } }; /* * * 弹出对话框通知用户更新程序 * * 弹出对话框的步骤: * 1.创建alertDialog的builder. * 2.要给builder设置属性, 对话框的内容,样式,按钮 * 3.通过builder 创建一个对话框 * 4.对话框show()出来 */ protected void showUpdataDialog() { AlertDialog.Builder builer = new Builder(this); builer.setTitle(版本升级); builer.setMessage(info.getDescription()); //当点确定按钮时从服务器上下载 新的apk 然后安装 װ builer.setPositiveButton(确定, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { Log.i(TAG, 下载apk,更新); downLoadApk(); } }); builer.setNegativeButton(取消, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub //do sth } }); AlertDialog dialog = builer.create(); dialog.show(); } /* * 从服务器中下载APK */ protected void downLoadApk() { final ProgressDialog pd; //进度条对话框 pd = new ProgressDialog(this); pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); pd.setMessage(正在下载更新); pd.show(); new Thread(){ @Override public void run() { try { File file = DownLoadManager.getFileFromServer(info.getUrl(), pd); sleep(3000); installApk(file); pd.dismiss(); //结束掉进度条对话框 } catch (Exception e) { Message msg = new Message(); msg.what = DOWN_ERROR; handler.sendMessage(msg); e.printStackTrace(); } }}.start(); } //安装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); startActivity(intent); } } package com.Android; import Java.io.BufferedInputStream; import Java.io.File; import Java.io.FileOutputStream; import Java.io.InputStream; import Java.net.HttpURLConnection; import Java.net.URL; import Android.app.ProgressDialog; import Android.os.Environment; public class DownLoadManager { public static 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()); InputStream is = conn.getInputStream(); File file = new File(Environment.getExternalStorageDirectory(), updata.apk); 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); } fos.close(); bis.close(); is.close(); return file; } else{ return null; } } } uses-permission Android:name=Android.permission.INTERNET/ uses-permission Android:name=Android.permission.WRITE_EXTERNAL_STORAGE/
Copyright © 2025 IZhiDa.com All Rights Reserved.
知答 版权所有 粤ICP备2023042255号