纵观现在的好多Android应用程序,应用本身都有检查更新的的功能,不用去应用市场下载更新。

今天来实现这个功能:(需要服务器的配合)

Demo的布局文件很简单:一个Button叫做“检查更新”。

java代码:

button的监听事件:(下面的代码在onCreate中就行)

ll_update.setOnClickListener(new View.OnClickListener() {      @Override      public void onClick(View arg0) {             checkUpdate();        }});

下面的nowVersion是获取你手机应用当前的版本名称:也是在onCreate方法中就行

try {            PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);            nowVersion = packageInfo.versionName;        } catch (NameNotFoundException e) {            e.printStackTrace();        }

下面是检查服务器的apk的版本名称:

     /**      * 下载更新,      */      protected void checkUpdate() {          proDialogShow(LoginActivity.this, "正在查询...");          RequestParams params = new RequestParams("url");//这个就是上面说的需要服务器配合的地方,需要服务器给一个接口,请求返回的字符串要包含新APK文件的版本名称,这样我们就可以跟当前的apk名称对比是否要更新          x.http().get(params, new Callback.CommonCallback() {                @Override              public void onCancelled(CancelledException arg0) {               }              @Override             public void onError(Throwable arg0, boolean arg1) {                                  PDialogHide();                 System.out.println("提示网络错误");              }              @Override            public void onFinished() {              }             @Override             public void onSuccess(String arg0) {                 PDialogHide();                 try {                     JSONObject object = new JSONObject(arg0);                      boolean success = object.getBoolean("succee");                      if (success) {                        String desc = object.getString("desc");//版本描述                        String downloadurl = object.getString("downloadurl");//新版本更新地址                         String versionname = object.getString("versionname");//新版本名称                         if (nowVersion.equals(versionname)) {                             System.out.println("当前版本为最新,不用跟新");                         } else {                             // 不同,弹出更新提示对话框                             setUpDialog(versionname, downloadurl, desc);                         }                     }                 } catch (JSONException e) {                     // TODO Auto-generated catch block                     e.printStackTrace();                 }             }         });     }

对话框提示下载的版本以及版本描述代码:

/**        *         * @param versionname        *            地址中版本的名字        * @param downloadurl        *            下载包的地址        * @param desc        *            版本的描述        */     protected void setUpDialog(String versionname, final String downloadurl,             String desc) {                  AlertDialog dialog = new AlertDialog.Builder(this).setCancelable(false)                 .setTitle("下载" + versionname + "版本").setMessage(desc)                 .setNegativeButton("取消", null)                 .setPositiveButton("下载", new DialogInterface.OnClickListener() {                      @Override                     public void onClick(DialogInterface arg0, int arg1) {                         // TODO Auto-generated method stub                        setDownLoad(downloadurl);                     }                 }).create();         dialog.show();     }

下面是正式的下载apk文件:(有些变量就自己定义一下)

/**      * 下载包      *       * @param downloadurl      *            下载的url      *       */     @SuppressLint("SdCardPath")     protected void setDownLoad(String downloadurl) {         // TODO Auto-generated method stub         RequestParams params = new RequestParams(downloadurl);         params.setAutoRename(true);//断点下载         params.setSaveFilePath(Environment.getExternalStorageDirectory().getPath() + File.separator+"你好.apk");         x.http().get(params, new Callback.ProgressCallback() {              @Override             public void onCancelled(CancelledException arg0) {                 // TODO Auto-generated method stub                              }              @Override             public void onError(Throwable arg0, boolean arg1) {                 // TODO Auto-generated method stub                 if(progressDialog!=null && progressDialog.isShowing()){                     progressDialog.dismiss();                 }                 System.out.println("提示更新失败");             }              @Override             public void onFinished() {                 // TODO Auto-generated method stub                              }              @Override             public void onSuccess(File arg0) {                 // TODO Auto-generated method stub                 if(progressDialog!=null && progressDialog.isShowing()){                     progressDialog.dismiss();                 }                 Intent intent = new Intent(Intent.ACTION_VIEW);                 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);                 intent.setDataAndType(Uri.fromFile(new File(Environment                         .getExternalStorageDirectory(), "你好.apk")),                         "application/vnd.android.package-archive");                 startActivity(intent);             }              @Override             public void onLoading(long total, long current, boolean isDownloading) {                 // TODO Auto-generated method stub                 progressDialog.setMax((int)total);                 progressDialog.setProgress((int)current);             }              @Override             public void onStarted() {                 // TODO Auto-generated method stub                 System.out.println("开始下载");                 progressDialog = new ProgressDialog(LoginActivity.this);                 progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//设置为水平进行条                 progressDialog.setMessage("正在下载中...");                 progressDialog.setProgress(0);                 progressDialog.show();             }              @Override             public void onWaiting() {                 // TODO Auto-generated method stub                              }         });     }

两个辅助函数:

private void proDialogShow(Context context, String msg) {         pDialog = new ProgressDialog(context);         pDialog.setMessage(msg);         // pDialog.setCancelable(false);         pDialog.show();     }      private void PDialogHide() {         try {             if (pDialog != null && pDialog.isShowing()) {                 pDialog.dismiss();             }         } catch (Exception e) {             e.printStackTrace();         }     }

基本流程就在上面。(流程很清晰,不应太依赖Demo,后续有时间整理的话在放出来)


会出现的问题:

1、dewnloadurl这个下载的地址是服务器给的,如果服务器的apk文件是中文命名的,会出现安装的时候:该"解析包出现错误";

说明下载文件出现了问题。我试过几次都是这个问题,到sd卡中查看发现,明明apk文件有10多兆,下载下来只有几十k,说明文件破坏了。我告诉服务器那边把apk名称改成英文,就好了。







更多相关文章

  1. 还在用android.support?该考虑迁移AndroidX了!
  2. Android(安卓)Studio SDK版本兼容问题,拷贝的Android包文件报错
  3. android Widget添加过程和android添加widget不更新的问题分析解
  4. 使用Maven管理Android项目(一)
  5. Android(安卓)SDK 2.2 开发环境详解
  6. Android(安卓)SDK,ADT,以及API的理解
  7. AndroidX介绍及项目迁移
  8. 离线配置Android开发环境
  9. 教你如何在 Android(安卓)使用多线程下载文件

随机推荐

  1. Android(安卓)滑动侧边栏(Sliding Menu)第
  2. Android(安卓)UI基础——SeekBar&RatingB
  3. 浅析Android线程模型
  4. [APK破解]终极狂飙3D漂移,无限金钱,解锁全
  5. Android(安卓)layout属性
  6. Android(安卓)常用布局整理
  7. Android(安卓)Studio 单刷《第一行代码》
  8. Android应用程序怎么刷到手机上
  9. 学Android的学习规划
  10. Android(安卓)打包签名