源码中用以下载客户端的类为DownloadService,是一个服务。如果你对android服务不够理解的话,建议先查阅下有关服务的知识点。源码分析如下:
1首先我们先来看下该服务中几个重写的方法:
1.1onCreate()中 首先声明了自定义的绑定器对象,并在自定义的绑定器中添加了几个界面可以访问服务的方法,我们发现在这几个方法中,目前实际用到的start()方法用以开始下载APK,其他的没有用到。获取通知管理器。设置服务为 非前台服务。代码注释中,火蚁表明了不确定性。 其实如果将服务设置为前台服务,绑定到一个通知中,那么APP的应用的程序级别就相对较高,可以有效降低服务被杀死的可能性。本人在实际开发中就用到了前台服务。
1.2onBind()函数中获取相关变量,返回绑定器对象。此处,可以优化下,既然已经自定义了绑定器,在绑定器中声明了相关方法,我们可以将一些变量的设置放在绑定器声明的方法中,这样可以确保,当多个Activity与服务绑定时,方便处理,比如多个下载任务。
2定义下载线程,实现Runnable接口的方式。Runnable mdownApkRunnable = new Runnable() ;因为下载相对耗时,而服务本身又是运行在主线程中,因此用子线程专门去负责下载;
3定义了一个消息处理器 Handler mHandler = new Handler(),当收到子线程(下载线程)发出的消息后, 处理下载进度更新,下载完成安装APK,取消通知的功能。
4核心下载方法downloadUpdateFile(),此方法中目前完成了基本的下载功能,如果下载半途,断开连接的话,则下载失败,没有任何处理,建议在捕获异常的情况下通过回调或者广播通知用户下载失败,另外需要关闭服务。如果再强大点,就是如何实现断点续传。 此处火蚁在子线程中,每10下做一次更新,避免频繁更新通知的进度,过渡消耗资源。
5启动下载服务的方法在UIHelper类中的openDownLoadService方法。此方法中用到了两个启动服务的方法,为什么要用两种呢?首先,我们要和服务通信,利用绑定器去访问启动下载的方法,所有肯定要用到bindService(intent, conn, Context.BIND_AUTO_CREATE)方法,另外,用户在界面执行完下载更新后,会可能跳转到其他界面,也就是说当前和服务绑定的界面销毁了,那么他解除了和服务之间的绑定,如果只有这个界面和服务绑定了那么界面销毁时,意味着和服务的所有绑定解除时,服务就会执行onbind()方法,进而执行ondestroy()方法,服务销毁,无法继续下载。但是当用startService方法时,及时访问者退出了访问,但是服务仍然在运行,仍然可以继续下载。
6其他和下载相关的一个死MainActivity中的checkUpdate(),检查服务器是否有更新信息。另一个是UpdateManager类根据检查更新的结果做相应的处理。