Android 一个简单的App版本更新功能的实现,页面可自定义(一)

先放GitHub项目地址

项目下载地址链接

再放效果图

![更新页面提示](Android 一个简单的App版本更新功能的实现,页面可自定义(一)_第1张图片)

![简易下载页面](Android 一个简单的App版本更新功能的实现,页面可自定义(一)_第2张图片)

由于高版本安卓系统权限原因无法直接安装apk,此处已经解决了Android7.0和Android8.0以上App不能安装的问题,并兼容Android7.0以下,如果不考虑安装问题,则可忽略这段话

实现步骤

  1. 因为我这里下载的apk位置是放在SD卡中,所以先要动态获取存储权限
  2. 获取后台版本号作对比
  3. 下载和安装的页面主要在DownloadApk类中进行,此处没有做断点续传功能,后期完善可加上
  4. 为了界面美观,这里我自定义了一个dialog,代码在GitHub项目中都可看见
public void downLoadApk(final Context mContext, final String url) {
        //进度条
        mProgressDialog = new Dialog(mContext, R.style.FullHeightDialog);
        mProgressDialog.setContentView(R.layout.loading_dialog);
        mProgressDialog.setCanceledOnTouchOutside(false);
        mProgress = mProgressDialog.findViewById(R.id.progressBar);
        mTvProgressCount = mProgressDialog.findViewById(R.id.tv_progress_count);
        ImageView ivDismiss = mProgressDialog.findViewById(R.id.iv_dismiss);
        ivDismiss.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(mContext, "后台下载中...", Toast.LENGTH_SHORT);
                progressDismiss();
            }
        });
        mProgress.setMax(100);
        mProgressDialog.show();
      }
  1. 下载操作在子线程中进行
new Thread() {
            @Override
            public void run() {
                try {
                    File file = getFileFromServer(url);
                    //安装APK
                    installApk(file, mContext);
                    progressDismiss(); //结束掉进度条对话框
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }.start();
  1. 下载还是用原生的HttpURLConnection来做,每次循环下载1024个字节,每隔一秒钟计算一下下载进度提示主线程去更新ui(注:这里的下载量用long表示,int可能会超出范围)
  2. 下载完之后安装兼容了几个版本,避免无法安装
try {
            Intent intent = new Intent();
            intent.setAction(Intent.ACTION_VIEW);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                // Android7.0及以上版本
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                //Uri contentUri = FileProvider.getUriForFile(mContext, "应用包名" + ".fileProvider", file);//参数二:应用包名+".fileProvider"(和步骤一中的Manifest文件中的provider节点下的authorities对应) 
                Uri contentUri = FileProvider.getUriForFile(mContext, mContext.getApplicationContext().getPackageName() + ".fileprovider", file);
                intent.setDataAndType(contentUri, "application/vnd.android.package-archive");

            } else {
                // Android7.0以下版本
                intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            }
            mContext.startActivity(intent);
        } catch (Exception e) {
            e.printStackTrace();
            //progressDismiss();
        }
  1. 有问题请指正,之后会进一步完善

你可能感兴趣的:(Android)