zoukankan      html  css  js  c++  java
  • Android自己主动检測版本号及自己主动升级

    步骤:

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

    2.从server获取版本号号(版本号号存在于xml文件里)并与当前检測到的版本号进行匹配,假设不匹配,提示用户进行升级。假设匹配则进入程序主界面。

    3.当提示用户进行版本号升级时。假设用户点击了确定,系统将自己主动从server上下载并进行自己主动升级,假设点击取消将进入程序主界面。

    效果图:

          

        

    获取当前程序的版本:

    [java] view plaincopy
    1. /* 
    2.  * 获取当前程序的版本  
    3.  */  
    4. private String getVersionName() throws Exception{  
    5.     //获取packagemanager的实例   
    6.     PackageManager packageManager = getPackageManager();  
    7.     //getPackageName()是你当前类的包名,0代表是获取版本号信息  
    8.     PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(), 0);  
    9.     return packInfo.versionName;   
    10. }  
    获取server端的版本:

    [java] view plaincopy
    1. /* 
    2.  * 用pull解析器解析server返回的xml文件 (xml封装了版本) 
    3.  */  
    4. public static UpdataInfo getUpdataInfo(InputStream is) throws Exception{  
    5.     XmlPullParser  parser = Xml.newPullParser();    
    6.     parser.setInput(is, "utf-8");//设置解析的数据源   
    7.     int type = parser.getEventType();  
    8.     UpdataInfo info = new UpdataInfo();//实体  
    9.     while(type != XmlPullParser.END_DOCUMENT ){  
    10.         switch (type) {  
    11.         case XmlPullParser.START_TAG:  
    12.             if("version".equals(parser.getName())){  
    13.                 info.setVersion(parser.nextText()); //获取版本  
    14.             }else if ("url".equals(parser.getName())){  
    15.                 info.setUrl(parser.nextText()); //获取要升级的APK文件  
    16.             }else if ("description".equals(parser.getName())){  
    17.                 info.setDescription(parser.nextText()); //获取该文件的信息  
    18.             }  
    19.             break;  
    20.         }  
    21.         type = parser.next();  
    22.     }  
    23.     return info;  
    24. }  
    从server下载apk:

    [java] view plaincopy
    1. public static File getFileFromServer(String path, ProgressDialog pd) throws Exception{  
    2.     //假设相等的话表示当前的sdcard挂载在手机上而且是可用的  
    3.     if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){  
    4.         URL url = new URL(path);  
    5.         HttpURLConnection conn =  (HttpURLConnection) url.openConnection();  
    6.         conn.setConnectTimeout(5000);  
    7.         //获取到文件的大小   
    8.         pd.setMax(conn.getContentLength());  
    9.         InputStream is = conn.getInputStream();  
    10.         File file = new File(Environment.getExternalStorageDirectory(), "updata.apk");  
    11.         FileOutputStream fos = new FileOutputStream(file);  
    12.         BufferedInputStream bis = new BufferedInputStream(is);  
    13.         byte[] buffer = new byte[1024];  
    14.         int len ;  
    15.         int total=0;  
    16.         while((len =bis.read(buffer))!=-1){  
    17.             fos.write(buffer, 0, len);  
    18.             total+= len;  
    19.             //获取当前下载量  
    20.             pd.setProgress(total);  
    21.         }  
    22.         fos.close();  
    23.         bis.close();  
    24.         is.close();  
    25.         return file;  
    26.     }  
    27.     else{  
    28.         return null;  
    29.     }  
    30. }  


    匹配、下载、自己主动安装:

    [java] view plaincopy
    1. /* 
    2.  * 从server获取xml解析并进行比对版本  
    3.  */  
    4. public class CheckVersionTask implements Runnable{  
    5.   
    6.     public void run() {  
    7.         try {  
    8.             //从资源文件获取server 地址   
    9.             String path = getResources().getString(R.string.serverurl);  
    10.             //包装成url的对象   
    11.             URL url = new URL(path);  
    12.             HttpURLConnection conn =  (HttpURLConnection) url.openConnection();   
    13.             conn.setConnectTimeout(5000);  
    14.             InputStream is =conn.getInputStream();   
    15.             info =  UpdataInfoParser.getUpdataInfo(is);  
    16.               
    17.             if(info.getVersion().equals(versionname)){  
    18.                 Log.i(TAG,"版本同样无需升级");  
    19.                 LoginMain();  
    20.             }else{  
    21.                 Log.i(TAG,"版本不同 ,提示用户升级 ");  
    22.                 Message msg = new Message();  
    23.                 msg.what = UPDATA_CLIENT;  
    24.                 handler.sendMessage(msg);  
    25.             }  
    26.         } catch (Exception e) {  
    27.             // 待处理   
    28.             Message msg = new Message();  
    29.             msg.what = GET_UNDATAINFO_ERROR;  
    30.             handler.sendMessage(msg);  
    31.             e.printStackTrace();  
    32.         }   
    33.     }  
    34. }  
    35.   
    36. Handler handler = new Handler(){  
    37.       
    38.     @Override  
    39.     public void handleMessage(Message msg) {  
    40.         // TODO Auto-generated method stub  
    41.         super.handleMessage(msg);  
    42.         switch (msg.what) {  
    43.         case UPDATA_CLIENT:  
    44.             //对话框通知用户升级程序   
    45.             showUpdataDialog();  
    46.             break;  
    47.         case GET_UNDATAINFO_ERROR:  
    48.             //server超时   
    49.             Toast.makeText(getApplicationContext(), "获取server更新信息失败"1).show();  
    50.             LoginMain();  
    51.             break;    
    52.         case DOWN_ERROR:  
    53.             //下载apk失败  
    54.             Toast.makeText(getApplicationContext(), "下载新版本号失败"1).show();  
    55.             LoginMain();  
    56.             break;    
    57.         }  
    58.     }  
    59. };  
    60.   
    61. /* 
    62.  *  
    63.  * 弹出对话框通知用户更新程序  
    64.  *  
    65.  * 弹出对话框的步骤: 
    66.  *  1.创建alertDialog的builder.   
    67.  *  2.要给builder设置属性, 对话框的内容,样式,button 
    68.  *  3.通过builder 创建一个对话框 
    69.  *  4.对话框show()出来   
    70.  */  
    71. protected void showUpdataDialog() {  
    72.     AlertDialog.Builder builer = new Builder(this) ;   
    73.     builer.setTitle("版本号升级");  
    74.     builer.setMessage(info.getDescription());  
    75.     //当点确定button时从server上下载 新的apk 然后安装   
    76.     builer.setPositiveButton("确定"new OnClickListener() {  
    77.     public void onClick(DialogInterface dialog, int which) {  
    78.             Log.i(TAG,"下载apk,更新");  
    79.             downLoadApk();  
    80.         }     
    81.     });  
    82.     //当点取消button时进行登录  
    83.     builer.setNegativeButton("取消"new OnClickListener() {  
    84.         public void onClick(DialogInterface dialog, int which) {  
    85.             // TODO Auto-generated method stub  
    86.             LoginMain();  
    87.         }  
    88.     });  
    89.     AlertDialog dialog = builer.create();  
    90.     dialog.show();  
    91. }  
    92.   
    93. /* 
    94.  * 从server中下载APK 
    95.  */  
    96. protected void downLoadApk() {  
    97.     final ProgressDialog pd;    //进度条对话框  
    98.     pd = new  ProgressDialog(this);  
    99.     pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);  
    100.     pd.setMessage("正在下载更新");  
    101.     pd.show();  
    102.     new Thread(){  
    103.         @Override  
    104.         public void run() {  
    105.             try {  
    106.                 File file = DownLoadManager.getFileFromServer(info.getUrl(), pd);  
    107.                 sleep(3000);  
    108.                 installApk(file);  
    109.                 pd.dismiss(); //结束掉进度条对话框  
    110.             } catch (Exception e) {  
    111.                 Message msg = new Message();  
    112.                 msg.what = DOWN_ERROR;  
    113.                 handler.sendMessage(msg);  
    114.                 e.printStackTrace();  
    115.             }  
    116.         }}.start();  
    117. }  
    118.   
    119. //安装apk   
    120. protected void installApk(File file) {  
    121.     Intent intent = new Intent();  
    122.     //运行动作  
    123.     intent.setAction(Intent.ACTION_VIEW);  
    124.     //运行的数据类型  
    125.     intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");  
    126.     startActivity(intent);  
    127. }  
    128.   
    129. /* 
    130.  * 进入程序的主界面 
    131.  */  
    132. private void LoginMain(){  
    133.     Intent intent = new Intent(this,MainActivity.class);  
    134.     startActivity(intent);  
    135.     //结束掉当前的activity   
    136.     this.finish();  
    137. }  


    UpdataInfo:

    [java] view plaincopy
    1. public class UpdataInfo {  
    2.     private String version;  
    3.     private String url;  
    4.     private String description;  
    5.     public String getVersion() {  
    6.         return version;  
    7.     }  
    8.     public void setVersion(String version) {  
    9.         this.version = version;  
    10.     }  
    11.     public String getUrl() {  
    12.         return url;  
    13.     }  
    14.     public void setUrl(String url) {  
    15.         this.url = url;  
    16.     }  
    17.     public String getDescription() {  
    18.         return description;  
    19.     }  
    20.     public void setDescription(String description) {  
    21.         this.description = description;  
    22.     }  
    23. }  


    update.xml:

    [html] view plaincopy
    1. <?

      xml version="1.0" encoding="utf-8"?>  

    2. <info>  
    3.     <version>2.0</version>  
    4.     <url>http://192.168.1.187:8080/mobilesafe.apk</url>  
    5.     <description>检測到最新版本号,请及时更新!</description>  
    6. </info>  
  • 相关阅读:
    小程序开发 access_token 统一管理
    python操作mysql
    Mac版本的idea非正常关闭后,idea打开项目大面积报红
    PySpider爬取去哪儿攻略数据项目
    Python3.9安装PySpider步骤及问题解决
    Selenium 自动化测试工具
    Python 抓取猫眼电影排行
    Python爬虫基本库
    Python 创建一个Django项目
    Python 数据可视化
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5083472.html
Copyright © 2011-2022 走看看