开源中国 OsChina Android 客户端源码分析(9)下载APK功能

源码中用以下载客户端的类为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类根据检查更新的结果做相应的处理。

时间: 2024-10-14 05:06:44

开源中国 OsChina Android 客户端源码分析(9)下载APK功能的相关文章

开源中国 OsChina Android 客户端源码分析(12)清理缓存

上一篇中 缓存对象中我们提到了,将对象数据缓存的地方有三个地方,这里我们详细的说下: 1(/data/data/com.xxx.xxx/cache) 应用私有的缓存目录,属于内部缓存,其他应用无法访问,一般存储较小的数据: 2(/mnt/sdcard/android/data/com.xxx.xxx/cache),应用私有的外部缓存目录. 3SD卡下的自定义目录,共用的. 要实现清除缓存,那么首先你需要知道: 1应用是否采用了缓存策略: 2缓存的数据是什么,在哪里进行了缓存? 3缓存大小的计算实

开源中国 OsChina Android 客户端源码分析(10)双击退出程序

在源码中,火蚁完全封装了  双击退出程序的功能 : DoubleClickExitHelper类 该类的源码分析如下: 1  构造函数中传入了 设备上下文,实现退出功能的界面,完成消息处理器的初始化:既然要有提示条,那么也需要一个Toast对象. 2 既然完全封装,那么 我们需要将 按键的事件及按键码传进去,因为界面重写的onKeyDown 事件需要返回一个boolean值,那么在DoubleClickExitHelper类中也自定义了一个返回布尔值的onKeyDown 函数. 3onKeyDo

开源中国 OsChina Android 客户端源码分析(8)数据库Sqlite

1开源中国客户端使用的数据库部分的源码在net.oschina.app.db包下,两个类一个是用于管理数据库的创建类DatabaseHelper,继承SQLiteOpenHelper,另一个是用于数据库的增删改查的工具类NoteDatabase.那么数据库在开源中国源码中哪一模块用到了呢? 便签管理,便签是什么?就是一个记事本的功能o(^▽^)o 2关于SQLiteOpenHelper的使用,自己之前的项目中没有用到过,看了下,这里有个体会:当获取到SQLiteOpenHelper实例,并使用g

开源中国 OsChina Android 客户端源码分析(3)可以拖拽的ScrollView

oschina客户端滑动菜单的View的布局使用了可以拖拽的ScrollView,类文件为CustomerScrollView. 1 我们需要分析下为什么要用ScrollView?用过的其实很容易理解避免其内部的子View的布局较大,在较小设备上无法完全显示. 2实现可拖拽的效果,只是从用户体验角度去考虑的,接下来我们详细分析下其自定义的ScrollView. 2.1拖拽的目标是ScrollView内的菜单的布局View,所以在CustomerScrollView内的onFinishInflat

开源中国 OsChina Android 客户端源码分析(2)滑动菜单

1滑动菜单oschina使用了android.support.v4.widget.DrawerLayout,之前没有用过这个控件,百度了下,大致了解如下: 1.1类似与LinearLayout,就是一个布局控件. 1.2使用时,其有两部分组成,主内容VIEW和菜单内容VIEW,并且主内容必须放在菜单内容的前面,才能让DrawerLayout识别谁是菜单的部分,其宽高都需要设置成match_parent.此处的主内容部分是什么?其实就是主界面上的用以显示各个fragment和底部的导航部分,所以o

开源中国 OsChina Android 客户端源码分析(1)启动界面 app_start

1启动界面的布局文件为app_start.xml ,对应的类文件为net.oschina.app 包下的AppStart.java. 2对于布局文件而言,因为只显示一张主题图片,因此布局简单直接设置背景图片.因为是启动界面,启动时会有短暂的卡顿,对于用户而言体验不好,因此在配置文件中自定义了style ,黑色 无标题 全屏(为什么选黑色的呢?是不是因为背景图图片是白的,衬托的更亮白呢?^_^).设置了背景图片和无标题 <style name="Theme.AppStartLoad"

开源中国 OsChina Android 客户端源码分析(4)自定义对话框

OsChina在主界面底部导航处设置了快速操作的对话框,图示: OsChina采用了Dialog的方式实现,有些人可能会用到popupwindow去实现.通过分析其实现原理,来学到对自己有用的东西. 1布局文件,dialog_quick_option.xml,布局代码不难 2自定义了对话框类QuickOptionDialog: 2.1在构造函数中加载了自定义的对话框的布局文件,初始化控件,完成了快速图片按钮的旋转动画(quick_option_close.xml).此处觉得应该把这部分工作放到o

[Android]Volley源码分析(四)

上篇中有提到NetworkDispatcher是通过mNetwork(Network类型)来进行网络访问的,现在来看一下关于Network是如何进行网络访问的. Network部分的类图: Network有一个实现类BasicNetwork,它有一个mHttpStack的属性,实际的网络请求是由这个mHttpStack来进行的,看BasicNetwork的performRequest()方法, 1 @Override 2 public NetworkResponse performRequest

Android IntentService 源码分析

IntentService简介: IntentService是一个通过Context.startService(Intent)启动可以处理异步请求的Service,使用时你只需要继承IntentService和重写其中的onHandleIntent(Intent)方法接收一个Intent对象,该服务会在异步任务完成时自动停止服务. 所有的请求的处理都在IntentService内部工作线程中完成,它们会顺序执行任务(但不会阻塞主线程的执行),某一时刻只能执行一个异步请求. IntnetServi