Android 条件断点,Android DownloadManager 的使用及断点续传-Go语言中文社区
发布日期:2022-02-21 12:50:38 浏览次数:40 分类:技术文章

本文共 4938 字,大约阅读时间需要 16 分钟。

Class Overview

The download manager is a system service that handles long-running HTTP downloads. Clients may request that a URI be downloaded to a particular destination file. The download manager will conduct the download in the background, taking care of

HTTP interactions andretrying downloads after failures or across connectivity changes and system reboots.Instances of this class should be obtained throughby

passing. Apps

that request downloads through this API should register a broadcast receiver forto

appropriately handle when the user clicks on a running download in a notification or from the downloads UI. Note that the application must have thepermission

to use this class.

从Android 2.3(API level 9)开始Android用系统服务(Service)的方式提供了Download Manager来优化处理长时间的下载操作。Download Manager处理HTTP连接并监控连接中的状态变化以及系统重启来确保每一个下载任务顺利完成。

在大多数涉及到下载的情况中使用Download Manager都是不错的选择,特别是当用户切换不同的应用以后下载需要在后台继续进行,以及当下载任务顺利完成非常重要的情况(DownloadManager对于断点续传功能支持很好)。

要想使用Download Manager,使用getSystemService方法请求系统的DOWNLOAD_SERVICE服务,代码片段如下:

String serviceString = Context.DOWNLOAD_SERVICE;

DownloadManager downloadManager;

downloadManager = (DownloadManager) getSystemService(serviceString);

String serviceString = Context.DOWNLOAD_SERVICE;

DownloadManager downloadManager;

downloadManager = (DownloadManager) getSystemService(serviceString);

下载文件

要请求一个下载操作,需要创建一个DownloadManager.Request对象,将要请求下载的文件的Uri传递给Download Manager的enqueue方法,代码片段如下所示:

String serviceString = Context.DOWNLOAD_SERVICE;

DownloadManager downloadManager;

downloadManager = (DownloadManager)getSystemService(serviceString);

Uri uri = Uri.parse("http://developer.android.com/shareables/icon_templates-v4.0.zip");

DownloadManager.Request request = newRequest(uri);

longreference

= downloadManager.enqueue(request);

String serviceString = Context.DOWNLOAD_SERVICE;

DownloadManager downloadManager;

downloadManager = (DownloadManager)getSystemService(serviceString);

Uri uri = Uri.parse("http://developer.android.com/shareables/icon_templates-v4.0.zip");

DownloadManager.Request request = newRequest(uri);

longreference = downloadManager.enqueue(request);

在这里返回的reference变量是系统为当前的下载请求分配的一个唯一的ID,我们可以通过这个ID重新获得这个下载任务,进行一些自己想要进行的操作或者查询

下载的状态以及取消下载等等。

我们可以通过addRequestHeader方法为DownloadManager.Request对象request添加HTTP头,也可以通过setMimeType方法重写从服务器返回的mime type。

我们还可以指定在什么连接状态下执行下载操作。setAllowedNetworkTypes方法可以用来限定在WiFi还是手机网络下进行下载,setAllowedOverRoaming方法

可以用来阻止手机在漫游状态下下载。

下面的代码片段用于指定一个较大的文件只能在WiFi下进行下载:

request.setAllowedNetworkTypes(Request.NETWORK_WIFI);

request.setAllowedNetworkTypes(Request.NETWORK_WIFI);

Android API level 11 介绍了getRecommendedMaxBytesOverMobile类方法(静态方法),返回一个当前手机网络连接下的最大建议字节数,可以来判断下载

是否应该限定在WiFi条件下。

调用enqueue方法之后,只要数据连接可用并且Download Manager可用,下载就会开始。

要在下载完成的时候获得一个系统通知(notification),注册一个广播接受者来接收ACTION_DOWNLOAD_COMPLETE广播,这个广播会包含一个

EXTRA_DOWNLOAD_ID信息在intent中包含了已经完成的这个下载的ID,代码片段如下所示:

IntentFilter filter =newIntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);

BroadcastReceiver receiver = newBroadcastReceiver()

{

@Override

publicvoidonReceive(Context

context, Intent intent) {

longreference

= intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);

if(myDownloadReference

== reference) {

}

}

};

registerReceiver(receiver, filter);

IntentFilter filter =newIntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);

BroadcastReceiver receiver = newBroadcastReceiver() {

@Override

publicvoidonReceive(Context context, Intent intent) {

longreference = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);

if(myDownloadReference == reference) {

}

}

};

registerReceiver(receiver, filter);

使用Download Manager的openDownloadedFile方法可以打开一个已经下载完成的文件,返回一个ParcelFileDescriptor对象。我们可以通过Download Manager来

查询下载文件的保存地址,如果在下载时制定了路径和文件名,我们也可以直接操作文件。

我们可以为ACTION_NOTIFICATION_CLICKED action注册一个广播接受者,当用户从通知栏点击了一个下载项目或者从Downloads app点击可一个下载的项目的

时候,系统就会发出一个点击下载项的广播。

代码片段如下:

IntentFilter filter =newIntentFilter(DownloadManager.ACTION_NOTIFICATION_CLICKED);

BroadcastReceiver receiver = newBroadcastReceiver()

{

@Override

publicvoidonReceive(Context

context, Intent intent) {

String extraID = DownloadManager.EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS;

long[]

references = intent.getLongArrayExtra(extraID);

for(longreference

: references)

if(reference

== myDownloadReference) {

// Do something with downloading file.

}

}

};

registerReceiver(receiver, filter);

IntentFilter filter =newIntentFilter(DownloadManager.ACTION_NOTIFICATION_CLICKED);

BroadcastReceiver receiver = newBroadcastReceiver() {

@Override

publicvoidonReceive(Context context, Intent intent) {

String extraID = DownloadManager.EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS;

long[] references = intent.getLongArrayExtra(extraID);

for(longreference : references)

if(reference == myDownloadReference) {

// Do something with downloading file.

}

}

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/Inconsolabl/article/details/48085903

站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

发表于 2020-04-19 16:00

阅读 ( 405 )

转载地址:https://blog.csdn.net/weixin_33958381/article/details/117345737 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:链表c语言 读指针,学习C语言指针和链表的体会
下一篇:荣耀电视鸿蒙系统安卓,刚刚!继发布或取代安卓的华为鸿蒙系统后,荣耀“电视”也来了...

发表评论

最新留言

很好
[***.229.124.182]2024年04月16日 15时13分30秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章