Download模块 (六)

Download模块 (六)


DownloadManager是一个重M+轻C的角色。
内部维护了所有Download的信息聚合<List>,并围绕此信息聚合提供一些查询类的功能,也有一些C操作。
DownloadManager 是一个单例模式的类,类载入时直接初始化一个sInstance.
DownloadManager其实也可以完全设计为一个static类,不过从其语义和定位考虑,一个manager最好不要是一个静态类。
并且静态类也会有诸多的限制,no zuo no die.


<1> DownloadManager内部维护了两个List<M>, 一个保存了所有的Download L1,  一个保存了下载完毕,但是tip还没有显示的Download L2,
构造时直接将两个List new出来. 两个List的含义和作用都非常明确.


<2> public的addDownload 会将给定的Download加入到L1< add(0, download) >的头,除了Download输入参数外,还有一个boolean标示该download是新添加的还是从上次没有
完成的任务读取的。如果不是新添加的,会对L1做一次sort,新添加的不需要,因为Download就是按照创建时间排序的。
DownloadManager类本身的addDownload只是修改M<修改L1>,至于触发的一系列操作则分布在别的实现类中,通过eventBus的event进行触发。


<3> getDownloads 会返回一个 Collections.unmodifiableList 保证了M的外部只读属性, 这是一个安全封装性的trick,直接返回L1会导致潜在的不应该的修改,因为java返回的是一个引用,
当然也可以返回一个L1的clone,但是仍然不能保证里面的Download信息不被修改,除非是完全clone。


<4> 一些简单的工具辅助函数:
    一个返回当前Download数目的函数
    一个返回当前pause/inProgress的Download数目的函数
    检查当前是否正在下载的Download
    获取对应某个url的Download<和Download的getUrl()进行equal匹配>
获取对应某个FIle的DownLoad<和Download的getFile()进行equal匹配>
移除某个Download, 可以选择是否还要删除硬盘上的文件,同时会触发一个DownloadRemove的event。
移除所有已经完成的DownLoad,对于因为文件损坏的case,删除文件和Download,也要触发DownloadRemove的event。

<5> pause所有的DownLoad, 遍历L1,有inProgress的直接调用DownLoad自己的pause() <类职责明确,DownLoadManager不应该知道如何pause某个Download,而应该只负责
告诉DownLoad需要pause>


<6> 继续所有被暂停的Download, 和上面一样,Download resume自己.


<7> 一个Download完成并且File完整性检测通过时的回调函数,这个函数的目的是对于apk可安装文件,会出现一个tip告知用户下载完毕可以安装,而如果是其他文件,则是打开
如果当前用户就已经在DownloadFragment 界面上,那么不需要显示tip。<是否在DownloadFragment 界面上是通过在Activity上保存一个
fragment引用,在DownloadFragment attach到该Activity时,会setter,detach的时候,会set 为 null>,下一步如果是可安装的,那么就尝试从apk包获取Icon,  
然后获取当前tipManager<一个专门的辅助类>正在显示的tip的类型,如果就是DownLoad_complete的tip,那么该Download放到L2中留待后面显示在tip上。
否则,直接让tip显示该Download已经完成可安装的tip。


<8> tipManager要求提供一个View用于显示在tip区域,因此需要一个函数来生成相应的View已经设置好其交互的listener<V + C>,
通过Activity作为context来得到一个inflater,inflate某个layout文件来得到一个可用的View,然后是琐碎的view内容设置,
一个关键点是要区分apk已经安装/没有安装的情况,如果没有安装过,那么clickListener要安装此APP,负责执行该DownLoad的open,
不管如何,用户与tip交互完以后,tip都要消失<tipManager来负责具体实现>,在将此Download的完成显示到tip以后,同时从L2中移除此Download.


<9> 还有一个不需要参数的泛用型批量Download完成显示函数,该函数最终的作用是用户点击tip以后会发出一个event来使DownloadFragment出现。并且清空L2。


<10> DownloadManager还监听着tipManager的tip hide的event,这样就可以有机会将L2中的Download的tip显示出来。构造manager的时候就将此监听器打开。
如果L2只有一个pending的Download,那么显示单个Download的tip,
如果有多余一个pending的Download,显示批量Download完成的tip。
最后都会将L2清空。


<11> 还有一个关于L2的case,用户如果再没有点击download tip的情况下,来到了DownloadFragment,那么用户默认在这种情况下已经知晓了所有的download完成的情况,
不再需要提醒,L2可以被清空 而 如果当前显示的tip是downloadTip的话,也应该将tip hide。也是通过监听 downloadFragment显示的 event来触发的。
这已经是交互设计细节的范畴了。


<12> DownLoadManager的open也是一个工具类函数<尝试用当前所安装的app来打开下载的文件>,供Download的open套壳使用.
在open该Download时,要先检测该Download的file是否已经下载完毕<Download的File exits(), 
因为只有下载完成以后才会将临时文件重命名为File代表的文件,因此是可以用exits来做判定的>,没下载完则通过一个dialog告知用户选择继续下载或者取消。
获取Download的MIME类型<默认取得时是Download的getMIME(), 不过也会使用MimeTypeMap来结合文件的后缀得到MimeType, 如果DownLoad提供的MIMEtype是空,或者Download给的MimeType是application/octet-stream, 但是经过MimeTypeMap得到的是application/vnd.android.package-archive(代表着apk),那么使用MimeTypeMap提供的>,构造一个ACTION_VIEW的Intent,设置FLAG_ACTIVITY_NEW_TASK,然后调用setDataAndType(),分别设置Uri.fromFile(file)和mimeType,
交由系统处理如何打开该下载的文件,注意要捕获ActivityNotFoundException<绝对有可能发生>,如果发生,触发一个DownloadOpenFail event。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值