前言:

  实现异步下载apk文件 并 安装。(进度条对话框显示下载进度的展现方式)

  涉及技术点:

        1、ProgressDialog       进度条对话框  用于显示下载进度

        2、AsyncTask             异步任务的使用    耗时操作不能再主线程中进行      安卓开发_浅谈AsyncTask

        3、File                       文件相关操作    将文件的字节数据生成文件

        4、自动打开安装应用操作       下载网络apk数据并生成文件之后需要我们去执行这个apk的安装操作(非静默安装)

   实现前提:

          1、我们下载的apk的url地址

        2、文件权限,网络权限    

   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />     //文件操作权限<uses-permission android:name="android.permission.INTERNET" />                  //网络权限

----------------------------------------------------------------------------------------------------------------------------------------

实现:

1、创建ProgressDialog对象,初始化操作,开启下载的异步任务

   private void showDownloadProgressDialog(Context context) {ProgressDialog progressDialog = new ProgressDialog(context);progressDialog.setTitle("提示");progressDialog.setMessage("正在下载...");progressDialog.setIndeterminate(false);progressDialog.setMax(100);progressDialog.setCancelable(false);                    //设置不可点击界面之外的区域让对话框小时progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);         //进度条类型progressDialog.show();String downloadUrl = "http://ac-edNxPKqQ.clouddn.com/800exxxxxxx68ebcefda.apk"; //这里写你的apk url地址new DownloadAPK(progressDialog).execute(downloadUrl);}

2、下载apk的异步任务

  首先看一下整个异步任务的结构

private class DownloadAPK extends AsyncTask<String, Integer, String> {ProgressDialog progressDialog;File file;public DownloadAPK(ProgressDialog progressDialog) {this.progressDialog = progressDialog;}@Overrideprotected String doInBackground(String... params) {       //根据url获取网络数据生成apk文件return null;}@Overrideprotected void onProgressUpdate(Integer... progress) {super.onProgressUpdate(progress);// 这里 改变ProgressDialog的进度值     }@Overrideprotected void onPostExecute(String s) {super.onPostExecute(s);       //到这里说明下载完成,判断文件是否存在,如果存在,执行安装apk的操作}}

  (1)、 局部变量

      ProgressDialog 用于显示下载进度

      File                  根据网络数据生成的apk文件

     ProgressDialog progressDialog;File file;

  (2)、构造方法,将外部的ProgressDialog对象传到异步任务里

      public DownloadAPK(ProgressDialog progressDialog) {this.progressDialog = progressDialog;}

  (3)、进度更新方法,将下载进度现在在对话框中

     @Overrideprotected void onProgressUpdate(Integer... progress) {super.onProgressUpdate(progress);progressDialog.setProgress(progress[0]);}

  (4)、下载网络数据生成apk文件的操作

     @Overrideprotected String doInBackground(String... params) {URL url;HttpURLConnection conn;BufferedInputStream bis = null;FileOutputStream fos = null;try {url = new URL(params[0]);conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("GET");conn.setConnectTimeout(5000);int fileLength = conn.getContentLength();bis = new BufferedInputStream(conn.getInputStream());String fileName = Environment.getExternalStorageDirectory().getPath() + "/magkare/action.apk";file = new File(fileName);if (!file.exists()) {if (!file.getParentFile().exists()) {file.getParentFile().mkdirs();}file.createNewFile();}fos = new FileOutputStream(file);byte data[] = new byte[4 * 1024];long total = 0;int count;while ((count = bis.read(data)) != -1) {total += count;publishProgress((int) (total * 100 / fileLength));fos.write(data, 0, count);fos.flush();}fos.flush();} catch (IOException e) {e.printStackTrace();} finally {try {if (fos != null) {fos.close();}} catch (IOException e) {e.printStackTrace();}try {if (bis != null) {bis.close();}} catch (IOException e) {e.printStackTrace();}}return null;}

  (5)、文件下载完成后

         判断文件是否存在,存在的话要打开安装apk的操作,并关闭进度对话框

               不存在的话说明文件下载失败,进行相关提示即可

    @Overrideprotected void onPostExecute(String s) {super.onPostExecute(s);openFile(file);                 //打开安装apk文件操作progressDialog.dismiss();      //关闭对话框}

  (6)、打开apk文件安装apk的操作

    

     private void openFile(File file) {if (file!=null){Intent intent = new Intent(Intent.ACTION_VIEW);intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");TaskListActivity.this.startActivity(intent);}}

效果图:

完整代码:

private void showDownloadProgressDialog(Context context) {ProgressDialog progressDialog = new ProgressDialog(context);progressDialog.setTitle("提示");progressDialog.setMessage("正在下载...");progressDialog.setIndeterminate(false);progressDialog.setMax(100);progressDialog.setCancelable(false);progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);progressDialog.show();String downloadUrl = "http://ac-edNxPKqQ.clouddn.com/80xxxxxxxebcefda.apk";new DownloadAPK(progressDialog).execute(downloadUrl);}/*** 下载APK的异步任务*/private class DownloadAPK extends AsyncTask<String, Integer, String> {ProgressDialog progressDialog;File file;public DownloadAPK(ProgressDialog progressDialog) {this.progressDialog = progressDialog;}@Overrideprotected String doInBackground(String... params) {URL url;HttpURLConnection conn;BufferedInputStream bis = null;FileOutputStream fos = null;try {url = new URL(params[0]);conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("GET");conn.setConnectTimeout(5000);int fileLength = conn.getContentLength();bis = new BufferedInputStream(conn.getInputStream());String fileName = Environment.getExternalStorageDirectory().getPath() + "/magkare/action.apk";file = new File(fileName);if (!file.exists()) {if (!file.getParentFile().exists()) {file.getParentFile().mkdirs();}file.createNewFile();}fos = new FileOutputStream(file);byte data[] = new byte[4 * 1024];long total = 0;int count;while ((count = bis.read(data)) != -1) {total += count;publishProgress((int) (total * 100 / fileLength));fos.write(data, 0, count);fos.flush();}fos.flush();} catch (IOException e) {e.printStackTrace();} finally {try {if (fos != null) {fos.close();}} catch (IOException e) {e.printStackTrace();}try {if (bis != null) {bis.close();}} catch (IOException e) {e.printStackTrace();}}return null;}@Overrideprotected void onProgressUpdate(Integer... progress) {super.onProgressUpdate(progress);progressDialog.setProgress(progress[0]);}@Overrideprotected void onPostExecute(String s) {super.onPostExecute(s);openFile(file);progressDialog.dismiss();}private void openFile(File file) {if (file!=null){Intent intent = new Intent(Intent.ACTION_VIEW);intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");TaskListActivity.this.startActivity(intent);}}}

异步下载apk文件并安装

  

------------------------------------------------------------------------------------------------------------------------------------------

注意:

如果是一次性全部获取到网络文件的字节数据,当文件过大的时候会出现OOM的问题。

此方法 实现边下载获取网络文件的字节数据边生成文件的操作。   不用担心OOM 的问题。 其他文件下载操作都可以参考此方法。

学习自  : http://www.cnblogs.com/laujiangtao/  同学

Android项目实战(三十一):异步下载apk文件并安装(非静默安装)相关推荐

  1. spark 大型项目实战(三十一): --性能调优之在实际项目中使用fastutil优化数据格式

    fastutil介绍: fastutil是扩展了Java标准集合框架(Map.List.Set:HashMap.ArrayList.HashSet)的类库,提供了特殊类型的map.set.list和q ...

  2. android 视频沉浸式,Android项目实战(四十一):游戏和视频类型应用 状态栏沉浸式效果...

    原文: Android项目实战(四十一):游戏和视频类型应用 状态栏沉浸式效果 需求: 手机app ,当打游戏或者全屏看视频的时候会发现这时候手机顶部的状态栏是不显示的,当我们从手机顶端向下进行滑动或 ...

  3. android圆角对话框,Android项目实战(三十二):圆角对话框Dialog

    原文: Android项目实战(三十二):圆角对话框Dialog 前言:html 项目中多处用到对话框,用系统对话框太难看,就本身写一个自定义对话框.android 对话框包括:一.圆角程序员 二.a ...

  4. Android项目实战(三十二):圆角对话框Dialog

    原文:Android项目实战(三十二):圆角对话框Dialog 前言: 项目中多处用到对话框,用系统对话框太难看,就自己写一个自定义对话框. 对话框包括:1.圆角 2.app图标 , 提示文本,关闭对 ...

  5. android注册文件打开,Android项目实战系列—基于博学谷(三)注册与登录模块

    由于这个模块内容较多,篇幅较长,请耐心阅读. 注册与登录模块分为三个部分 [x] [欢迎界面]() [x] [注册界面]() [x] [登录界面]() 一.欢迎界面 1.创建工程,命名为BoXueGu ...

  6. Android项目实战(三十八):2017最新 将AndroidLibrary提交到JCenter仓库(图文教程)...

    Android项目实战(三十八):2017最新 将AndroidLibrary提交到JCenter仓库(图文教程) 原文:Android项目实战(三十八):2017最新 将AndroidLibrary ...

  7. 【Android项目实战 | 从零开始写app(十三)】实现用户中心模块清除token退出登录信息修改等功能

    五一后,被ji金伤了,哇呜呜,还是得苦逼老老实实打工写代码,看下面吧 本篇实现效果: 实现登录用户名展示到用户中心页面上,并且页面有个人信息,订单列表,修改密码,意见反馈发送到服务端,前面登录后,通过 ...

  8. 基于eclipse的android项目实战—博学谷(二十三)其他功能

    本项目是用eclipse软件编写,经过我的亲自实践,其真实有效,希望能给您有所帮助 项目版本:android5.1.1 ADT版本:23.0.6 SDK版本:24.4.1 运行模拟器:夜神模拟器 若有 ...

  9. (转载)Android项目实战(二十八):使用Zxing实现二维码及优化实例

    Android项目实战(二十八):使用Zxing实现二维码及优化实例 作者:听着music睡 字体:[增加 减小] 类型:转载 时间:2016-11-21 我要评论 这篇文章主要介绍了Android项 ...

最新文章

  1. Centos7源码安装mysql及读写分离,互为主从
  2. 九度oj 题目1354:和为S的连续正数序列
  3. Majority Element II
  4. Web安全的三个攻防姿势
  5. ASP.NET Core MVC 配置全局路由前缀
  6. Mysql查询高速缓存区
  7. 2021年Java基础面试题总结
  8. SecureCRT资源下载安装
  9. 索尼计算机bios正确设置,索尼vaio笔记本如何进入bios设置_索尼笔记本进入bios图解...
  10. 游戏制作之路(51)地形细节工具
  11. vue用html方式路由守卫,vue-router 实现导航守卫(路由卫士)的实例代码
  12. 无序列表将点替换成图片
  13. 使用Fairseq微调预训练模型
  14. 干货 :超详细的AI 专家路线图!
  15. Redux以及Flux介绍
  16. Android界面编程之利用单选框和复选框实现对学历和爱好进行选择
  17. 浅析中小企业人力资源管理体系建设
  18. 英语语法汇总(3.代词)
  19. 邬建国在2008内蒙古大学毕业典礼上的讲话
  20. 砖家:“IPV9” - 美国没有成功,中国搞成了

热门文章

  1. [译] RxJava 中的错误处理
  2. 微信小程序WebSocket相关问题说明
  3. Web前端开发之“常见模块你真的很了解吗?”
  4. Nginx + Tomcat6配置负载均衡
  5. 闲谈: 测试报告的插入图片
  6. 微信公众帐号开发教程第8篇-文本消息中使用网页超链接
  7. file表单元素怎样设置浏览按钮的样式
  8. CSS实现返回网页顶部
  9. 使用 Helm - 每天5分钟玩转 Docker 容器技术(163)
  10. 一次应对PowerShell+WMI挖矿***的记录