1.检测当前版本的信息AndroidManifest.xml-->manifest-->android:versionName。
2.从服务器获取版本号(版本号存在于xml文件中)并与当前检测到的版本进行匹配,如果不匹配,提示用户进行升级,如果匹配则进入程序主界面。
3.当提示用户进行版本升级时,如果用户点击了确定,系统将自动从服务器上下载并进行自动升级,如果点击取消将进入程序主界面。
效果图:
获取当前程序的版本号:
- private String getVersionName() throws Exception{
-
- PackageManager packageManager = getPackageManager();
-
- PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(), 0);
- return packInfo.versionName;
- }
获取服务器端的版本号:
- 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;
- }
从服务器下载apk:
- public static File getFileFromServer(String path, ProgressDialog pd) throws Exception{
-
- 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;
- }
- }
匹配、下载、自动安装:
- public class CheckVersionTask implements Runnable{
-
- public void run() {
- try {
-
- String path = getResources().getString(R.string.serverurl);
-
- URL url = new URL(path);
- HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- conn.setConnectTimeout(5000);
- InputStream is =conn.getInputStream();
- info = UpdataInfoParser.getUpdataInfo(is);
-
- if(info.getVersion().equals(versionname)){
- Log.i(TAG,"版本号相同无需升级");
- 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) {
-
- super.handleMessage(msg);
- switch (msg.what) {
- case UPDATA_CLIENT:
-
- showUpdataDialog();
- break;
- case GET_UNDATAINFO_ERROR:
-
- Toast.makeText(getApplicationContext(), "获取服务器更新信息失败", 1).show();
- LoginMain();
- break;
- case DOWN_ERROR:
-
- Toast.makeText(getApplicationContext(), "下载新版本失败", 1).show();
- LoginMain();
- break;
- }
- }
- };
-
- protected void showUpdataDialog() {
- AlertDialog.Builder builer = new Builder(this) ;
- builer.setTitle("版本升级");
- builer.setMessage(info.getDescription());
-
- builer.setPositiveButton("确定", new OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- Log.i(TAG,"下载apk,更新");
- downLoadApk();
- }
- });
-
- builer.setNegativeButton("取消", new OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
-
- LoginMain();
- }
- });
- AlertDialog dialog = builer.create();
- dialog.show();
- }
-
- 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();
- }
-
- 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);
- }
-
- private void LoginMain(){
- Intent intent = new Intent(this,MainActivity.class);
- startActivity(intent);
-
- this.finish();
- }
UpdataInfo:
- public class UpdataInfo {
- private String version;
- private String url;
- private String description;
- 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;
- }
- }
update.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <info>
- <version>2.0</version>
- <url>http://192.168.1.187:8080/mobilesafe.apk</url>
- <description>检测到最新版本,请及时更新!</description>
- </info>