绿茶浏览器的下载管理

1、下载相关的类


Android自带的下载管理原理其实很简单,整体基于内容提供者ContentProvider、内容解析者ContentResolver和内容监听者ContentObserver来实现下载的管理,通过ContentResolver操作ContentProvider来触发ContentObserver,从而执行真正的下载操作,下载过程又用到了消息机制。

DownloadListener

网页执行下载的回调接口。

DownloadManager

该类是下载管理的核心类,从名字就可以知道该类主要提供一些管理Download的API,以service的形式提供给开发人员的,即通过getSystemService。它的所有操作都是基于ContentResolver,其中触发真正下载的函数是enqueue(Request request)方法。
DownloadManager.Request下载请求

Downloads

声明了很多常量,主要提供给DownloadManager.(详见源码)
public staticfinal int STATUS_PAUSED = 191;
还没开始下载的暂停状态
public static final int STATUS_RUNNING = 192;
已经开始下载
public static final int STATUS_PAUSED_BY_APP= 193;
手动暂停下载
public static final int STATUS_SUCCEED = 200;
已经下载完全成功,但是也有一些状态值能代表成功了,用isSucccess函数来获得其他的信息

DownloadService

用于监听DownloadContent中的数据变化,从而执行相应的操作,例如:开启下载线程、暂停、重新开始下载等

DownloadThread

主要用于执行下载的操作,包括一些下载中异常的处理。

2、下载中的MimeType和ContentDisposition


常见MimeType:

MimeType extension
image/jpeg jpg
image/gif gif
text/html html
audio/mpeg mp3
audio/x-wav wav
video/x-msvideo avi

mime-type指定了下载资源的类型,如果为下载的文件指定mime-type有错误,可能出现不能被其他应用识别的情况,例如下载的图片时,如果指定mime-type类型为image/*,会导致文件管理器中的图片分类可能无法识别图片类型的文件,彩信无法发送图片等情况,这些应用都是通过mime-type识别图片的。

ContentDisposition

ContentDisposition主要在下载时用于猜文件名字

3、当点击了浏览器页面中的某个连接,为什么会下载?


点击浏览器中的链接,向服务器发送请求得到相应的资源,如果资源无法被浏览器的rendering engine处理,就会调用OnDownloadStart,这部分逻辑主要由内核处理。
在Android4.4以后部分下载链接没有回调OnDownloadStart,原因是Android4.3内核升级之后,在点击网页中的链接时,网页发送了GET的request,渲染引擎根据request信息里的MIME Type,判断是否支持在线播放该类型的视频,如果能够处理服务器返回的响应,支持了在线播放此类型的视频, 就不会回调onDownloadStart,也就是该链接不会产生下载事件,因此不会调用浏览器应用的回调onDownloadStart,而是直接通过网页打开播放。这样就导致部分音视频不能选择下载而只能直接播放,为满足项目项目中运营商规范,提供workround解决方案包括:长按处理、过滤url。

4、网络变化时的下载


在项目中经常遇到的下载问题是接打电话、收发短信和彩信、切换网络类型时遇到下载暂停后无法按要求自动恢复,此类问题的本质原因是网络状态发生了变化,因此解决这些问题主要是围绕网络变化的规律来展开。

理解网络类型

平时对网络类型的理解还不够准确,容易将wifi、3G、2G的类别混淆,网络类型主要包括Wifi、移动数据连接(4G、3G、2G),它们在底层的实现各不相同,像打电话、收发短信之类的功能都是与数据连接有关,使用这些功能的时候会对数据连接造成影响,但不会影响wifi。

由于两种网络类型有本质的区别,切换这两种类型的网络时会出现网络短暂的断开,导致下载暂停,下载的状态变为STATUS_WAITING_FOR_NETWORK,Android官方的自动恢复下载需要5分钟,为了符合项目规范的30秒内恢复下载,浏览器需要提前执行恢复下载。

恢复下载的时机

要想使恢复下载成功需具备以下条件:
1).网络的连接良好
2).支持断点续传(基本都支持)
依据这两个条件我们需要监听网络改变后的网络状态

Wifi状态的监听

需要注册广播:WifiManager.NETWORK_STATE_CHANGED_ACTION
只适用于监听Wifi关闭或打开过程的状态。Wifi打开需要一个过程,其DetailedState如下:
OBTAINING_IPADDR(分配IP地址)——>VERIFYING_POOR_LINK(不可靠的连接)——>CAPTIVE_PORTAL_CHECK(检查是否为强制用户)——>CONNECTED(连接完成,会发送ConnectivityManager.CONNECTIVITY_ACTION广播)
当wifi处于CONNECTED后可以执行恢复下载。
Wifi关闭过程的DetailedState一直是DISCONNECTED,可用于控制是否自动恢复。

数据连接状态的监听:

通过TelephonyManager的listen方法注册一个重载了onDataConnectionStateChanged方法的PhoneStateListener对象就可以实现监听

PhoneStateListener.onDataConnectionStateChanged()
只适用于监听数据连接改变时的状态,如2G和3G之间的切换,切换过程一般是经历连接-断开-连接过程,由于有时候2G和3G之间切换会平滑过渡,不会出现断开的情况,也就不会发送ConnectivityManager.CONNECTIVITY_ACTION的广播。

网络连接状态的监听:

需要注册广播:ConnectivityManager.CONNECTIVITY_ACTION
只适用于监听网络连接改变后处于connected时的状态,当数据连接的不同类型之间平滑切换就不能能通过此方式监听到。

PS:

此外网络中断下载也有可能与网络质量有关系,网络中断大部分会产生sockettimeoutexception,造成这种异常的情况有很多,需结合实际场景分析。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • iOS开发系列--网络开发 概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博、微信等,这些应用本身可...
    lichengjin阅读 3,637评论 2 7
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,435评论 25 707
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,863评论 6 13
  • Chapter2 单词和句段 1.As he listened to them talking, Tristran...
    姜小饼阅读 371评论 0 0