好贷网好贷款

Android 提示版本更新的实现

发布时间:2016-12-3 14:56:00 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"Android 提示版本更新的实现",主要涉及到Android 提示版本更新的实现方面的内容,对于Android 提示版本更新的实现感兴趣的同学可以参考一下。

步骤: 1.检测当前版本的信息AndroidManifest.xml-->manifest-->android:versionName。 2.从服务器获取版本号(版本号存在于xml文件中)并与当前检测到的版本进行匹配,如果不匹配,提示用户进行升级,如果匹配则进入程序主界面。 3.当提示用户进行版本升级时,如果用户点击了确定,系统将自动从服务器上下载并进行自动升级,如果点击取消将进入程序主界面。 [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.}     [java] view plaincopy 获取服务器端的版本号:    1./*    2. * 用pull解析器解析服务器返回的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.}     [java] view plaincopy 从服务器下载apk:    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 /*    * 从服务器获取xml解析并进行比对版本号     */     public class CheckVersionTask implements Runnable{              public void run() {             try {                 //从资源文件获取服务器 地址                   String path = getResources().getString(R.string.serverurl);                 //包装成url的对象                   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();             }          }     }     [java] view plaincopy Handler handler = new Handler(){             @Override         public void handleMessage(Message msg) {             // TODO Auto-generated method stub              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:                     //下载apk失败                      Toast.makeText(getApplicationContext(), "下载新版本失败", 1).show();                     LoginMain();                 break;                   }         }     };    [java] view plaincopy /*    *     * 弹出对话框通知用户更新程序     *     * 弹出对话框的步骤:    *  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 OnClickListener() {         public void onClick(DialogInterface dialog, int which) {                 Log.i(TAG,"下载apk,更新");                 downLoadApk();             }            });         //当点取消按钮时进行登录          builer.setNegativeButton("取消", new OnClickListener() {             public void onClick(DialogInterface dialog, int which) {                 // TODO Auto-generated method stub                  LoginMain();             }         });         AlertDialog dialog = builer.create();         dialog.show();     }    [java] view plaincopy /*    * 从服务器中下载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();     }   [java] view plaincopy //安装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");//编者按:此处Android应为android,否则造成安装不了           startActivity(intent);     }     [java] view plaincopy /*    * 进入程序的主界面    */     private void LoginMain(){         Intent intent = new Intent(this,MainActivity.class);         startActivity(intent);         //结束掉当前的activity           this.finish();     }   二、参考后使用情况: 1.可以下载apk,但安装失败: 1)以为配置文件中需定义了android.permission.INSTALL_PACKAGES,其实不需; 2)以为是要在执行安装的activity中配置 [xml] view plaincopy <intent-filter>           <action android:name="android.intent.action.VIEW" />           <category android:name="android.intent.category.DEFAULT" />   </intent-filter>   ,其实不是;  3)代码中application/vnd.Android.package-archive有一个字母A大写了,改小写后解决。 文章出处:http://blog.csdn.net/qq435757399/article/details/8670354

上一篇:hdu2594 Simpsons’ Hidden Talents
下一篇:13条创业公司不应忽视的用户体验设计准则

相关文章

相关评论