您的位置:首页 > 移动开发

Android学习系列(17)--App离线下载

2016-05-23 15:52 218 查看
宜未雨而绸缪,毋临渴而掘井。----朱用纯《治家格言》
      离线下载,在有网络的情况下下载服务器数据,以便无网络时也能阅读,就是离线阅读。

      离线下载的功能点如下:

      1.下载管理(开始、取消下载)。

      2.网络判断(Wi-Fi,3G)。

      3.独立进程。

      4.定时和手机催醒。

      5.自启动。 

1.下载管理

       这里不便关注下载的细节方法,网络下载的方法很多,大概如下:

      这里要注意几点:

      (1).在下载的时候,我们希望能及时检测到网络状况,比如由Wi-Fi切换到3G网络下,我们应该能及时停止下载。

      (2).当用户选择取消下载的时候,我们也能停止当前下载。 

2.网络判断

      获取当前网络状态,主要分为Wi-Fi和Mobile(包括3G,GPRS)两种,我们写一个工具类如下:

      根据网络状态,我们能够控制下载方式:

      (1).下载量很大的情况下,我们不大可能在3G情况下进行下载,容易引起用户的反感和担忧。

      (2).当客户十分确认可以在3G情况下进行下载,那么也是允许的。

      所以,这里提出一个需求,我们要为下载方式设置一个灵活的等级,结合离线下载的特点,我们给出3中方案由用户选择:

      (1).移动数据情况下自动下载

      (2).只允许Wi-Fi情况下自动下载

      (3).关闭下载

      这里只列出了自动下载,是因为如果不是自动下载,手动下载用户可以随意控制,无需设置,当然设计到丢流量情况下,如3G下手动下载,提示用户会消耗较大的数据流量,慎用即可。

      现在可以根据规则比较当前网络和离线网络设置,判定离线下载服务的开启。

3.独立进程

      离线下载,无论何时何地,只要适宜进行,则当进行,目前主流的做法是建立后台服务。

     (1).OfflineService的进程如果默认和应用程序一致,则在应用进程kill的时候,会重启一次(网易新闻在离线下载的时候,退出应用,下载会停顿一小会儿就是这个原因),如果影响不大,这个方案也是可选的。

     (2).OfflineService的进程和应用程序分开,如应用程序进程为"cn.cnblogs.tianxia.download",则离线下载服务的进程设置为"cn.cnblogs.tianxia.download.offline",撇清和应用程序的进程的关系。当然,这个会带来一个新的问题,进程间通信,当然因为离线下载和应用程序间的模块比较独立,这个问题还算比较好规避。

     (3).OfflineService的进程如果默认和应用程序一致,但是OfflineService继承IntentService,可避免重启的问题,这个是《Pro Android 3》书中提到的方法,非常的好用,但是非常遗憾,本人最近才看到,暂时没有亲手测验,不敢在工作中试用。

     按理说,方案3是最佳方案, 但是个人原因,选择了方案2.

4.定时下载和手机催醒

     根据用户设置,在wifi的情况下自动下载,但是自动下载的方案有很多种,频繁的更新下载,定点下载(早上8点,下午4点),间隔下载(每隔6小时)。

     这里,我们选择每隔6个小时下载。

     (1).这里介绍一种错误的方案。一看到每隔6小时,很容易想到开启一个子线程计时,累计到6个小时,子线程通知下载服务开始新一轮下载。这个方案的思路是没有错的,但是却忽略了手机处于休眠状态,这个子线程其实是停止执行的,那么所谓的6个小时的效果就又可能永远达不到,而且必然不正确或者不准确。

     (2).所以,需要使用到一种不休眠的办法:定时器和广播接收器。每隔6小时我们发送一个广播,广播接收器通知开始离线下载。(可参考newsrob源码和书籍《Pro Android 3》):

    
private

long
lastDownloadTime;


      OfflineAlarmRecriver中处理开始下载条件,并通知开始下载:

     前面我们提到了线程休眠的问题,需要在下载的时候能够唤醒手机,下载完成后能回到休眠状态,下面是两个工具方法:

         其中PowerManager.PARTIAL_WAKE_LOCK意思是仅唤醒CPU方式,此时能自动主动检测网络状态,从而保证网络正常。

需要在Mainifest.xml中设置权限:

       然后在下载服务的onStartConmmand()激活催醒状态,然后在下载完成后释放催醒状态:

5.自启动

      为了代码清晰,我们再定义一个自启动的receiver:

       在AndroidManifest.xml注册此接收器,如下:

      这样,在启动的时候,能够接受启动广播,并执行启动定时器操作。

6.小结

      为了简洁明晰,开门见山,本文仅针对离线下载的最重要的关联点列举说明,而对于清理策略,手动和自动模式,界面跳转,UI设计和业务要求没有过多的涉及,但是往往这些东西才是花费你大量的时间,需要大量细节的积累和耐心的调试,我们唯一要做的事情就是不断的完善!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: