Android 开发中,经常有从服务器下载数据的需求出现,尤其是在线更新App的情形。其基本思路是根据本地的App版本号和服务器的版本号进行比较,如果服务器版本较新,再进行提示然后下载Apk最后进行安装。这种需求解决方案有很多,第三方的网络框架基本都有这个功能。

Android自带的DownloadManager是一个很好的下载文件的工具。该类在API level 9之后出现,它已经帮我们处理了下载失败、重新下载等功能,整个下载过程全部交给系统负责,不需要我们过多的处理,非常的nice。关键的是用起来也很简单,很爽,稍微封装一下就可以几句话搞定下载。

下面以一个简单案例来实现从服务器下载一个Apk文件并进行安装。

1、打开本地Tomcat服务器,放入一个Apk文件

Tomcat.png

2、开启Tomcat,然后确保能从浏览器下载

浏览器下载.png

3、编写DownloadManager工具类,代码注释很详细

public class DownloadUtils {

//下载器

private DownloadManager downloadManager;

//上下文

private Context mContext;

//下载的ID

private long downloadId;

public DownloadUtils(Context context){

this.mContext = context;

}

//下载apk

public void downloadAPK(String url, String name) {

//创建下载任务

Request request = new Request(Uri.parse(url));

//移动网络情况下是否允许漫游

request.setAllowedOverRoaming(false);

//在通知栏中显示,默认就是显示的

request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);

request.setTitle("新版本Apk");

request.setDescription("Apk Downloading");

request.setVisibleInDownloadsUi(true);

//设置下载的路径

request.setDestinationInExternalPublicDir(Environment.getExternalStorageDirectory().getAbsolutePath() , name);

//获取DownloadManager

downloadManager = (DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE);

//将下载请求加入下载队列,加入下载队列后会给该任务返回一个long型的id,通过该id可以取消任务,重启任务、获取下载的文件等等

downloadId = downloadManager.enqueue(request);

//注册广播接收者,监听下载状态

mContext.registerReceiver(receiver,

new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));

}

//广播监听下载的各个状态

private BroadcastReceiver receiver = new BroadcastReceiver() {

@Override

public void onReceive(Context context, Intent intent) {

checkStatus();

}

};

//检查下载状态

private void checkStatus() {

Query query = new Query();

//通过下载的id查找

query.setFilterById(downloadId);

Cursor c = downloadManager.query(query);

if (c.moveToFirst()) {

int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));

switch (status) {

//下载暂停

case DownloadManager.STATUS_PAUSED:

break;

//下载延迟

case DownloadManager.STATUS_PENDING:

break;

//正在下载

case DownloadManager.STATUS_RUNNING:

break;

//下载完成

case DownloadManager.STATUS_SUCCESSFUL:

//下载完成安装APK

installAPK();

break;

//下载失败

case DownloadManager.STATUS_FAILED:

Toast.makeText(mContext, "下载失败", Toast.LENGTH_SHORT).show();

break;

}

}

c.close();

}

//下载到本地后执行安装

private void installAPK() {

//获取下载文件的Uri

Uri downloadFileUri = downloadManager.getUriForDownloadedFile(downloadId);

if (downloadFileUri != null) {

Intent intent= new Intent(Intent.ACTION_VIEW);

intent.setDataAndType(downloadFileUri, "application/vnd.android.package-archive");

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

mContext.startActivity(intent);

mContext.unregisterReceiver(receiver);

}

}

}

4、编写Activity代码初始化工具类,然后下载

public class MainActivity extends AppCompatActivity {

private DownloadUtils downloadUtils;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

downloadUtils = new DownloadUtils(MainActivity.this);

downloadUtils.downloadAPK("http://192.168.1.104:8080/XXX.apk", "XXX.apk");

}

}

5、配置权限

6、运行结果

运行以后会去下载服务器的Apk,通知栏也会有相应的通知。当下载完毕以后,会弹出安装界面。

通知栏

通知栏提醒.png

主界面

主界面.gif

android实现下载功能实现,Android开发之DownloadManager的使用相关推荐

  1. Android Studio多功能闹钟[android源码]

    Android Studio多功能闹钟[android源码] 多功能闹钟App 简 介 主 要 技 术 界面截图 主要代码 源码链接 作者信息 多功能闹钟App 简 介 此多功能闹钟界面采用TabHo ...

  2. android 图片横竖判断_Android应用开发之android 判断ImageView当前显示的是哪一张图片...

    本文将带你了解Android应用开发之android   判断ImageView当前显示的是哪一张图片,希望本文对大家学Android有所帮助. 判断ImageView当前显示的是哪一张图片 Java ...

  3. Android之基于xmpp openfire smack开发之Android客户端开发[3]

    http://blog.csdn.net/shimiso/article/details/11225873 在上两篇文章中,我们依次介绍openfire部署以及smack常用API的使用,这一节中我们 ...

  4. android webview权限申请_Android应用开发之android 6.0下webview的定位权限设置方法

    本文将带你了解Android应用开发android 6.0下webview的定位权限设置方法,希望本文对大家学Android有所帮助. 如下所示: WebView webView =   (WebVi ...

  5. Chrome 55 浏览器推出 Android 离线下载功能

    谷歌已经推出适用于Mac,Windows和Linux的Chrome 55浏览器,其中一项重大更新是默使用HTML5,以便进一步让Flash寿终正寝.现在谷歌又推出Chrome 55浏览器安卓版,增加了 ...

  6. android清理缓存功能吗,Android清理缓存功能实现

    我们都知道在Android的设置->应用程序中可以查看应用程序的相关信息,其中有一个功能是清除缓存.如图: 怎么实现这些功能呢,从Android的setting源码中可以得到相关信息. 实现如下 ...

  7. android 断点下载的实现,Android实现断点下载的方法

    最近做的项目中需要实现断点下载,即用户一次下载可以分多次进行,下载过程可以中断,在目前大多数的带离线缓存的软件都是需要实现这一功能.本文阐述了通过sqlite3简单实现了一个具有断点下载功能的demo ...

  8. android 收藏歌曲功能,基于android的网络音乐播放器-回调实现音乐播放及音乐收藏的实现(三)...

    作为android初学者,最近把疯狂android讲义和疯狂Java讲义看了一遍,看到书中介绍的知识点非常多,很难全部记住,为了更好的掌握基础知识点,我将开发一个网络音乐播放器-EasyMusic来巩 ...

  9. android客服功能介绍,Android 客服工作台 SDK

    Android 客服工作台 SDK 开发工具 目录 build.gradle 配置 添加依赖,在app的build.gradle 中dependencies中加入如下(添加后需同步gradle): a ...

最新文章

  1. MySql练习题参考答案
  2. C 中 main 函数的参数
  3. 你一定不能错过,Java视频全套
  4. FPGA笔记(1)-逻辑代数与逻辑电路基础
  5. 数据结构+算法——错题总结
  6. selenium webdriver 启动三大浏览器Firefox,Chrome,IE
  7. css定位position
  8. 可能是最好理解的二叉树的层序遍历
  9. “超大杯”版小米10不仅有120W超级快充,电池也要比传闻大
  10. JS计算两个日期时间差,天 小时 分 秒格式
  11. django admin下拉列表不显示值,显示为object的处理
  12. codeforces776D
  13. Good, then we can start
  14. 基于局部自适应阈值的图像二值化
  15. 十二周二次课 12.6 Nginx安装 12.7 默认虚拟主机 12.8 Nginx用户认证 12.
  16. SeSe 2005-02-11 -- 2005-02-12
  17. 读书感受 之 《反脆弱 · 做一个内心强大的人》
  18. php源码旅行网站模板,背包客旅行扁平网站模板
  19. 雷达基础系列文章之四:雷达专业国内期刊
  20. STM32:Modbus-RTU通讯协议——CRC校验

热门文章

  1. 不错的BLOG和论坛
  2. pytorchtf等 深度学习实验管理工具(Sacred)
  3. 90后最担心的事情不是猝死而是脱发!赋强教你防脱发!
  4. 中国地质大学(北京) 研究生 数学课《机器学习》期末考试 考试范围+考试题目+参考答案 2022秋
  5. PMP报考条件不符合不知道怎么解决?全套操办方法安排上了!不懂就看
  6. 【1024程序员节】我们的世界不只0和1
  7. dnsmasq 的配置
  8. 【EI会议】2022年人工智能与统计学前沿国际会议(CFAIS 2022)
  9. Thumbnails 压缩后反而变大
  10. 什么是RAID?RAID有什么用?RAID原理是什么