一、基本概念
    1、DownloadManager是Android 2.3A (API level 9) 引入的,基于http协议,用于处理长时间下载。

2、DownloadManager对于断点续传功能支持很好 。

二、权限设置(由于下载会需要SD卡存储,所以需要SD卡文件读写权限)

    <uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

三、request.setNotificationVisibility 可以用来控制什么时候显示Notification,甚至是隐藏该request的Notification 。

(1)Request.VISIBILITY_VISIBLE

在下载进行的过程中,通知栏中会一直显示该下载的Notification,当下载完成时,该Notification会被移除,这是默认的参数值。

(2)Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED

在下载过程中通知栏会一直显示该下载的Notification,在下载完成后该Notification会继续显示,直到用户点击该Notification或者消除该Notification。

 (3)Request.VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION

只有在下载完成后该Notification才会被显示。

(4)Request.VISIBILITY_HIDDEN

不显示该下载请求的Notification。如果要使用这个参数,需要在应用的清单文件中加上DOWNLOAD_WITHOUT_NOTIFICATION权限。

相对应的代码

   //设置状态栏中显示Notification

//设置Notification的标题

request.setTitle( "微信下载" ) ;

request.setDescription( "5.3.6" ) ;

request.setNotificationVisibility( Request.VISIBILITY_VISIBLE ) ;

request.setNotificationVisibility( Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED ) ;

request.setNotificationVisibility( Request.VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION ) ;

request.setNotificationVisibility( Request.VISIBILITY_HIDDEN ) ;

 四:下载的文件,存放路径

/**
* 设置下载文件存储目录
*/
void setDownloadFilePath( Request request ){
/**
* 方法1:
* 目录: Android -> data -> com.app -> files -> Download -> 微信.apk
* 这个文件是你的应用所专用的,软件卸载后,下载的文件将随着卸载全部被删除
*/ //request.setDestinationInExternalFilesDir( this , Environment.DIRECTORY_DOWNLOADS , "微信.apk" ); /**
* 方法2:
* 下载的文件存放地址 SD卡 download文件夹,pp.jpg
* 软件卸载后,下载的文件会保留
*/
//在SD卡上创建一个文件夹
//request.setDestinationInExternalPublicDir( "/mydownfile/" , "weixin.apk" ) ; /**
* 方法3:
* 如果下载的文件希望被其他的应用共享
* 特别是那些你下载下来希望被Media Scanner扫描到的文件(比如音乐文件)
*/
//request.setDestinationInExternalPublicDir( Environment.DIRECTORY_MUSIC, "笨小孩.mp3" ); /**
* 方法4
* 文件将存放在外部存储的确实download文件内,如果无此文件夹,创建之,如果有,下面将返回false。
* 系统有个下载文件夹,比如小米手机系统下载文件夹 SD卡--> Download文件夹
*/
//创建目录
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).mkdir() ; //设置文件存放路径
request.setDestinationInExternalPublicDir( Environment.DIRECTORY_DOWNLOADS , "weixin.apk" ) ;
}

五、应用实例

package com.app;
import android.app.Activity;
import android.app.DownloadManager;
import android.app.DownloadManager.Query;
import android.app.DownloadManager.Request;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.MimeTypeMap;
import android.widget.Toast; public class MainActivity extends Activity implements OnClickListener { String url = "http://shouji.360tpcdn.com/150527/c90d7a6a8cded5b5da95ae1ee6382875/com.tencent.mm_561.apk" ;
private long mReference = 0 ;
private DownloadManager downloadManager ; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView( R.layout.activity_main ) ; //取消下载
findViewById( R.id.cancle_bt ).setOnClickListener( this ); //查看下载状态
findViewById( R.id.look_bt ).setOnClickListener( this ); //注册广播接收器
IntentFilter filter = new IntentFilter( DownloadManager.ACTION_DOWNLOAD_COMPLETE ) ;
registerReceiver( receiver , filter ) ; Request request = new Request( Uri.parse( url ) ); //下载网络需求 手机数据流量、wifi
request.setAllowedNetworkTypes( Request.NETWORK_MOBILE | Request.NETWORK_WIFI ) ; //设置是否允许漫游网络 建立请求 默认true
request.setAllowedOverRoaming( true ) ; //设置通知类型
setNotification( request ) ; //设置下载路径
setDownloadFilePath( request ) ; /*在默认的情况下,通过Download Manager下载的文件是不能被Media Scanner扫描到的 。
进而这些下载的文件(音乐、视频等)就不会在Gallery 和 Music Player这样的应用中看到。
为了让下载的音乐文件可以被其他应用扫描到,我们需要调用Request对象的
*/
request.allowScanningByMediaScanner() ; /*如果我们希望下载的文件可以被系统的Downloads应用扫描到并管理,
我们需要调用Request对象的setVisibleInDownloadsUi方法,传递参数true。*/
request.setVisibleInDownloadsUi( true ) ; //设置请求的Mime
MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
request.setMimeType(mimeTypeMap.getMimeTypeFromExtension(url)); //开始下载
downloadManager = (DownloadManager)getSystemService(DOWNLOAD_SERVICE) ;
mReference = downloadManager.enqueue( request ) ; /*
下载管理器中有很多下载项,怎么知道一个资源已经下载过,避免重复下载呢?
我的项目中的需求就是apk更新下载,用户点击更新确定按钮,第一次是直接下载,
后面如果用户连续点击更新确定按钮,就不要重复下载了。
可以看出来查询和操作数据库查询一样的
*/
Query query = new Query() ;
query.setFilterById( mReference );
Cursor cursor = downloadManager.query( query ) ;
if ( !cursor.moveToFirst() ) {// 没有记录 } else {
//有记录
} } /**
* 设置状态栏中显示Notification
*/
void setNotification(Request request ) {
//设置Notification的标题
request.setTitle( "微信下载" ) ; //设置描述
request.setDescription( "5.3.6" ) ; //request.setNotificationVisibility( Request.VISIBILITY_VISIBLE ) ; request.setNotificationVisibility( Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED ) ; //request.setNotificationVisibility( Request.VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION ) ; //request.setNotificationVisibility( Request.VISIBILITY_HIDDEN ) ;
} /**
* 设置下载文件存储目录
*/
void setDownloadFilePath( Request request ){
/**
* 方法1:
* 目录: Android -> data -> com.app -> files -> Download -> 微信.apk
* 这个文件是你的应用所专用的,软件卸载后,下载的文件将随着卸载全部被删除
*/ //request.setDestinationInExternalFilesDir( this , Environment.DIRECTORY_DOWNLOADS , "微信.apk" ); /**
* 方法2:
* 下载的文件存放地址 SD卡 download文件夹,pp.jpg
* 软件卸载后,下载的文件会保留
*/
//在SD卡上创建一个文件夹
//request.setDestinationInExternalPublicDir( "/mydownfile/" , "weixin.apk" ) ; /**
* 方法3:
* 如果下载的文件希望被其他的应用共享
* 特别是那些你下载下来希望被Media Scanner扫描到的文件(比如音乐文件)
*/
//request.setDestinationInExternalPublicDir( Environment.DIRECTORY_MUSIC, "笨小孩.mp3" ); /**
* 方法4
* 文件将存放在外部存储的确实download文件内,如果无此文件夹,创建之,如果有,下面将返回false。
* 系统有个下载文件夹,比如小米手机系统下载文件夹 SD卡--> Download文件夹
*/
//创建目录
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).mkdir() ; //设置文件存放路径
request.setDestinationInExternalPublicDir( Environment.DIRECTORY_DOWNLOADS , "weixin.apk" ) ;
} /**
* 广播接受器, 下载完成监听器
*/
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction() ;
if( action.equals( DownloadManager.ACTION_DOWNLOAD_COMPLETE )){
//下载完成了
//获取当前完成任务的ID
long reference = intent.getLongExtra( DownloadManager.EXTRA_DOWNLOAD_ID , -1 ); Toast.makeText( MainActivity.this , "下载完成了" , Toast.LENGTH_SHORT ).show() ; //自动安装应用
Util util = new Util() ;
util.openFile(context ); } if( action.equals( DownloadManager.ACTION_NOTIFICATION_CLICKED )){
//广播被点击了
Toast.makeText( MainActivity.this , "广播被点击了" , Toast.LENGTH_SHORT ).show() ;
}
}
}; @Override
public void onClick(View v) {
switch ( v.getId() ) {
case R.id.cancle_bt :
//取消下载, 如果一个下载被取消了,所有相关联的文件,部分下载的文件和完全下载的文件都会被删除。
downloadManager.remove( mReference ) ;
break ; case R.id.look_bt :
Query query = new Query() ;
query.setFilterById( mReference );
Cursor cursor = downloadManager.query( query ) ; if( cursor == null ){
Toast.makeText( MainActivity.this , "Download not found!", Toast.LENGTH_LONG ).show();
}else{ //以下是从游标中进行信息提取
cursor.moveToFirst();
String msg = statusMessage( cursor ) ;
Toast.makeText( MainActivity.this , msg , Toast.LENGTH_SHORT ).show() ;
}
break;
}
} /**
* 查询状态
* @param c
* @return
*/
private String statusMessage(Cursor c){
switch(c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS ))){
case DownloadManager.STATUS_FAILED:
return "Download failed";
case DownloadManager.STATUS_PAUSED:
return "Download paused";
case DownloadManager.STATUS_PENDING:
return "Download pending";
case DownloadManager.STATUS_RUNNING:
return "Download in progress!";
case DownloadManager.STATUS_SUCCESSFUL:
return "Download finished";
default:
return "Unknown Information";
}
}
}

六:项目下载地址

http://download.csdn.net/detail/yanzi2015/8839023

DownloadManager 的使用的更多相关文章

  1. [Android Pro] 判断Uri对应的ContentProvider所操作的数据库u存在,及DownloadManager的暂停,继续

    reference to : http://blog.csdn.net/u012858313/article/details/38821857 项目中遇到一个问题,就是用到DownloadManage ...

  2. app的自动更新(调用DownloadManager)

    具体思路为:调用接口与服务器版本对比,当服务器版本号大于本地的,调用DownloadManager进行下载,之前也试过很多方法,但是兼容性都不是很好,还有一点要注意的是,在这里我并没有设置固定的下载路 ...

  3. DownloadManager

    在androi中,volley适合小文件的获取和大并发,如果支持大文件的下载可以用Android原生的DownloadManager.DownloadManager默认支持多线程下载.断点续传等. 基 ...

  4. Android 使用 DownloadManager 管理系统下载任务的方法,android管理系统

    从Android 2.3(API level 9)开始Android用系统服务(Service)的方式提供了Download Manager来优化处理长时间的下载操作.Download Manager ...

  5. DownloadManager补漏

    原始完成于:2014-10-24 20:01:03 DownloadManager是一个处理HTTP下载请求的系统服务: 1. 基本用法 1 private void download() { 2 R ...

  6. Android--调用系统的DownLoadManager去下载文件

    代码里面有详细的注释: /** * 该方法是调用了系统的下载管理器 */ public void downLoadApk(Context context,String url){ /** * 在这里返 ...

  7. 使用downloadmanager调用系统的下载

    /** * 文件名 UpdateDownload.java * 包含类名列表 com.issmobile.numlibrary.tool * 版本信息  版本号  * 创建日期 2014年7月14日  ...

  8. DownloadManager 下载管理类

    演示 简介 从Android 2.3开始新增了一个下载管理类,在SDK的文档中我们查找android.app.DownloadManager可以看到.下载管理类可以长期处理多个HTTP下载任务,客户端 ...

  9. 安卓开发之非常好用的AndroidOne框架DownloadManager

    AndroidOne框架是采用MVC模式,集成了Android主流开源技术及组件,是一款极速且简单高效开发框架,整个项目包含两个部分AndroidOne,oneCore AndroidOne为演示项目 ...

随机推荐

  1. 安卓序列化漏洞 —— CVE-2015-3525

    在2014年,Jann Horn发现一个安卓的提权漏洞,该漏洞允许恶意应用从普通应用权限提权到system用户执行命令,漏洞信息与POC见(1].漏洞的成因源于在安卓系统(<5.0)中,java ...

  2. HDU4550+贪心

    /* 贪心 先挑出最小的Mm,然后在Mm左侧的按情况考虑,右侧的按顺序排列. */ #include<stdio.h> #include<string.h> #include& ...

  3. win7中的画图

    下午做一个图像篡改定位实验,在win7下对图像进行修改,然后通过其最低位判断篡改位置. 程序如何都调试不出来.反复简化程序,发现win7中的画图对图像存在优化. 当更改图像后,会自动调整当前图像的显示 ...

  4. http协议客户端向服务器端请求时一般需要发送的内容

    out.println("GET /shopping/index.html HTTP/1.1");//请求行 包括请求方式,文件路径, http协议版本(必写)请求头.... ou ...

  5. Android学习笔记之使用百度地图实现地图控制

    PS:吾之荣耀,离别已久. 学习内容: 1.实现地图控制. 2.百度地图开发的一些细节     1.实现地图控制:   这一篇主要写在百度地图上添加一些其他控制.上一篇书写了覆盖物的添加,地理编码和反 ...

  6. 用Javascript实现回到顶部效果

    用Javascript实现回到顶部效果 经常看到网页中有回到顶部的效果,今天也研究一下回到顶部有哪些方法.众所周知,用锚链接是实现回到最简单的方法,但是从用户体验效果来说,并不是最好的.(锚链接回到顶 ...

  7. IOS开发UI基础UIView

    主要介绍下UIView得基本概念和一些属性的介绍至于属性的用户后面会由详细的介绍 -.UIView基本概念 1.什么是控件? 屏幕上所有的UI元素都叫做控件 (也有很多书中叫做视图 组件) 比如 按钮 ...

  8. Sprint Three 回顾与总结&发表评论&团队贡献分

    ● 一.回顾与总结 (1)回顾 燃尽图: Sprint计划-流程图: milestones完成情况如下: (2)总结 从sprint one到three,我们团队配合十分默契,互相帮助,虽然遇到了不少 ...

  9. P6 EPPM Manual Installation Guide (Oracle Database)

    P6 EPPM Manual Installation Guide (Oracle Database) P6 EPPM Manual Installation Guide (Oracle Databa ...

  10. SQL SERVER实例解析

    什么是SQL SERVER实例 ------------ SQL SERVER实例的概念和“类与对象”的概念很相似.可以把SQL SERVER的安装程序看做是一个类,安装过程则是创建对象的过程,创建出 ...