步骤:

1.检测当前版本的信息AndroidManifest.xml-->manifest-->android:versionName。

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

3.当提示用户进行版本升级时,如果用户点击了确定,系统将自动从服务器上下载并进行自动升级,如果点击取消将进入程序主界面。

Android更新aar android更新版本_android

Android更新aar android更新版本_android_02

Android更新aar android更新版本_android_03

Android更新aar android更新版本_Android更新aar_04


 

获取当前程序的版本号:



/*  

 * 获取当前程序的版本号   

 */   

privateString getVersionName()throwsException{   

//获取packagemanager的实例     

 PackageManager packageManager = getPackageManager();   

 //getPackageName()是你当前类的包名,0代表是获取版本信息    

 PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(),0);   

return packInfo.versionName;    

}





 

获取服务器端的版本号: 


./*  

 * 用pull解析器解析服务器返回的xml文件 (xml封装了版本号)  

 */   

publicstaticUpdataInfo getUpdataInfo(InputStream is)throwsException{   

 XmlPullParser  parser = Xml.newPullParser();     

parser.setInput(is,"utf-8");//设置解析的数据源     

int type = parser.getEventType();   

 UpdataInfo info =newUpdataInfo();//实体    

 while(type != XmlPullParser.END_DOCUMENT ){   

switch (type) {   

case XmlPullParser.START_TAG:   

if("version".equals(parser.getName())){   

         info.setVersion(parser.nextText());//获取版本号    

           }elseif("url".equals(parser.getName())){   

                info.setUrl(parser.nextText());//获取要升级的APK文件    

            }elseif("description".equals(parser.getName())){   

              info.setDescription(parser.nextText());//获取该文件的信息    

           }   

          break;   

        }   

       type = parser.next();   

   }   

  returninfo;   

}






 

从服务器下载apk: 



publicstaticFile getFileFromServer(String path, ProgressDialog pd)throwsException{   

  //如果相等的话表示当前的sdcard挂载在手机上并且是可用的    

  if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){   

      URL url =newURL(path);   

       HttpURLConnection conn =  (HttpURLConnection) url.openConnection();   

      conn.setConnectTimeout(5000);   

     //获取到文件的大小     

      pd.setMax(conn.getContentLength());   

       InputStream is = conn.getInputStream();   

      File file =newFile(Environment.getExternalStorageDirectory(),"updata.apk");   

      FileOutputStream fos =newFileOutputStream(file);   

      BufferedInputStream bis =newBufferedInputStream(is);   

      byte[] buffer =newbyte[1024];   

      intlen ;   

       inttotal=0;   

      while((len =bis.read(buffer))!=-1){   

          fos.write(buffer,0, len);   

          total+= len;   

       //获取当前下载量    

         pd.setProgress(total);   

       }   

      fos.close();   

        bis.close();   

       is.close();   

      returnfile;   

    }   

   else{   

    returnnull;   

    }   

}





匹配、下载、自动安装:


/* 

 * 从服务器获取xml解析并进行比对版本号  

 */  

public class CheckVersionTask implementsRunnable{  

  publicvoidrun() {  

      try{  

           //从资源文件获取服务器 地址    

           String path = getResources().getString(R.string.serverurl);  

         //包装成url的对象    

            URL url =newURL(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 =newMessage();  

               msg.what = UPDATA_CLIENT;  

             handler.sendMessage(msg);  

           }  

        }catch(Exception e) {  

            // 待处理    

         Message msg =newMessage();  

         msg.what = GET_UNDATAINFO_ERROR;  

          handler.sendMessage(msg);  

          e.printStackTrace();  

       }   

    }  

}





Handler handler = newHandler(){      

    @Override  

   publicvoidhandleMessage(Message msg) {  

        // TODO Auto-generated method stub   

       super.handleMessage(msg);  

      switch(msg.what) {  

     caseUPDATA_CLIENT:  

        //对话框通知用户升级程序    

        showUpdataDialog();  

           break;  

         caseGET_UNDATAINFO_ERROR:  

              //服务器超时    

              Toast.makeText(getApplicationContext(),"获取服务器更新信息失败",1).show();  

             LoginMain();  

         break;    

           caseDOWN_ERROR:  

              //下载apk失败   

               Toast.makeText(getApplicationContext(),"下载新版本失败",1).show();  

              LoginMain();  

           break;    

           }  

   }  

};





/* 

 *  

 * 弹出对话框通知用户更新程序  

 *  

 * 弹出对话框的步骤: 

 *  1.创建alertDialog的builder.   

 *  2.要给builder设置属性, 对话框的内容,样式,按钮 

 *  3.通过builder 创建一个对话框 

 *  4.对话框show()出来   

 */  

protected void showUpdataDialog() {  

    AlertDialog.Builder builer =newBuilder(this) ;   

   builer.setTitle("版本升级");  

   builer.setMessage(info.getDescription());  

   //当点确定按钮时从服务器上下载 新的apk 然后安装    

    builer.setPositiveButton("确定",newOnClickListener() {  

   publicvoidonClick(DialogInterface dialog,intwhich) {  

           Log.i(TAG,"下载apk,更新");  

         downLoadApk();  

      }     

   });  

   //当点取消按钮时进行登录   

   builer.setNegativeButton("取消",newOnClickListener() {  

     publicvoidonClick(DialogInterface dialog,intwhich) {  

            // TODO Auto-generated method stub   

          LoginMain();  

       }  

   });  

   AlertDialog dialog = builer.create();  

  dialog.show();  

}


/* 

 * 从服务器中下载APK 

 */  

protected void downLoadApk() {  

 finalProgressDialog pd;   //进度条对话框   

  pd =new ProgressDialog(this);  

  pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);  

  pd.setMessage("正在下载更新");  

  pd.show();  

  newThread(){  

   @Override  

     publicvoidrun() {  

          try{  

           File file = DownLoadManager.getFileFromServer(info.getUrl(), pd);  

             sleep(3000);  

            installApk(file);  

          pd.dismiss();//结束掉进度条对话框   

      }catch(Exception e) {  

             Message msg =newMessage();  

            msg.what = DOWN_ERROR;  

            handler.sendMessage(msg);  

            e.printStackTrace();  

         }  

      }}.start();  

}







//安装apk    

protected void installApk(File file) {  

 Intent intent =newIntent();  

 //执行动作   

  intent.setAction(Intent.ACTION_VIEW);  

  //执行的数据类型   

  intent.setDataAndType(Uri.fromFile(file),"application/vnd.Android.package-archive");//编者按:此处Android应为android,否则造成安装不了    

   startActivity(intent);  

}








二、参考后使用情况:
1.可以下载apk,但安装失败:

1)以为配置文件中需定义了android.permission.INSTALL_PACKAGES,其实不需;

2)以为是要在执行安装的activity中配置




<intent-filter>

        <actionandroid:name="android.intent.action.VIEW"/>

      <categoryandroid:name="android.intent.category.DEFAULT"/>

</intent-filter>





,其实不是; 

3)代码中application/vnd.Android.package-archive有一个字母A大写了,改小写后解决;