一、基本概念
    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. [转]GeoHash核心原理解析

    原文出处: zhanlijun    引子 机机是个好动又好学的孩子,平日里就喜欢拿着手机地图点点按按来查询一些好玩的东西.某一天机机到北海公园游玩,肚肚饿了,于是乎打开手机地图,搜索北海公园附近的餐 ...

  2. winform 指定浏览器打开链接

      Process myProcess = new Process();   myProcess.StartInfo.FileName = "firefox.exe";//&quo ...

  3. Mac OS使用ll、la、l等ls的别名命令

    在linux下习惯使用ll.la.l等ls别名的童鞋到mac os可就郁闷了-- 其实只要在用户目录下建立一个脚本“.bash_profile”,并输入以下内容即可: alias ll='ls -al ...

  4. 封装系统自带的Debug

    Unity3d的Debug.Log函数用于打印日志,一般项目中都会对其作如下两件事情: (1)希望有一个总的开关来控制整个游戏中日志的打印与否: (2)有的系统会将Log封一层并添加统一的标记,比如S ...

  5. Windows7 x64 系统下安装 Nodejs 并在 WebStorm 9.0.1 下搭建编译 LESS 环境

    1. 打开Nodejs官网http://www.nodejs.org/,点“DOWNLOADS”,点64-bit下载“node-v0.10.33-x64.msi”. 2. 下载好后,双击“node-v ...

  6. 使用 Responsive Elements 快速构建响应式网站

    Responsive Elements 可以使任何元素来适应和应对他们所占据的区域.这是一个轻量的 JavaScript 库,你可以轻松嵌入到你的项目.元素会更具自己的宽度,自动响应和适应空间的增加或 ...

  7. Xcode-Xcode 7.3 解决不能自动联想问题

    一.问题: 升级Xcode 7.3 之后发现导入头文件之后,没法自动联想. 二. 解决办法: 打开Xcode --> Target --> BuildSettings --> App ...

  8. 资料下载:生活方向盘PPT以及活动录音(2011.02)

    本文已挪至 http://www.zhoujingen.cn/blog/676.html 免费PDF和活动录音下载: http://down.51cto.com/data/216824 敏捷个人生活方 ...

  9. JS魔法堂:IE5~9的Drag&Drop API

    一.前言     < HTML5魔法堂:全面理解Drag & Drop API>中提到从IE5开始已经支持DnD API,但IE5~9与HTML5的API有所不同,下面我们来了解一 ...

  10. CMD魔法堂:获取进程路径和PID值的方法集

    一.前言    在开发发布更更新工具——更新Weblogic应用模块时,了解到更新Weblogic应用需要先关闭Weblogic应用窗口然后是清缓存.更新应用文件,最后再重启Weblogic应用窗口. ...