本章将先分析ContentService中数据通知机制的实现,然后分析AccountManagerService,最后再介绍ContentService中的数据同步服务。
在理解内部实现之前,最好先弄清增么用。由于涉及的类太多,搞不清楚状况,可以先阅读:
https://sites.google.com/site/andsamples/concept-of-syncadapter-androidcontentabstractthreadedsyncadapter
http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-1/
http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-2/
ContentService包含以下两个主要功能:
· 它是Android平台中数据更新通知的执行者。数据更新通知与Cursor,query函数实现时提到的ContentObserver有关。
· 它是Android平台中数据同步服务的管理中枢。当用户通过Android手机中的Contacts应用将联系人信息同步到远端服务器时,就需要和ContentService交互
AccountManagerService,负责管理Android手机中用户的账户,这些账户是用户的online账户,例如用户在Google、Facebook上注册的账户。
1. 数据更新通知机制分析
如果程序需要监控某数据项的变化,可以采用一个类似while循环的语句不断查询它以判断其值是否发生了变化。显而易见,这种方式的效率很低。有了通知机制以后,程序只需注册一个ContentObserver实例即可。一旦该项数据发生变化,系统就会通过ContentObserver的onChange函数来通知我们。与前面所述的轮询相比,此处的通知方式明显更高效。
通过上面的描述可以知道,通知机制的实施包括两个步骤:第一步,注册观察者;第二步,通知观察者。在Android平台中,这两步都离不开ContentService,下面来认识一下它。
1.1 ContentService的生成和初始化
SystemServer创建ContentService的代码非常简单。直接调用了ContentService的main函数。在一般情况下,该函数第二个参数为false。
ContentService中最难的功能是数据同步服务,不过该功能的实现都封装在SyncManager及相关类中了,所以在分析通知机制时不会和数据同步服务有太多瓜葛。
1.2 ContentResovler.registerContentObserver
下面来分析通知机制实施的第一步,注册ContentObserver。该步骤由ContentResovler提供的registerContentObserver函数来实现。registerContentObserver最终将调用ContentService的registerContentObserver函数。
1.2.1 ContentObserver
内部定义了一个Transport类参与Binder通信。由图可知,Transport类从IContentObserver.stub派生。从Binder通信角度来看,客户端进程中的Transport将是Bn端。如此,通过registerContentObserver传递到ContentService所在进程的就是Bp端。IContentObserverBp端对象的真实类型是IContentObserver.Stub.Proxy。
注意IContentObserver.java由aidl处理IContentObserver.aidl生成
1.2.2 ContentService.registerContentObserver函数分析
ContentService要做的事情其实很简单,就是保存uri和observer的对应关系到其内部变量mRootNode中
mRootNode是ContentService的成员变量,其类型为ObserverNode。ObserverNode的组织形式是数据结构中的树,其叶子节点的类型为ObserverEntry,它保存了uri和对应的IContentObserver对象。
1.3 ContentResolver的 notifyChange
再来看通知机制实施的第二步,即通知观察者。数据更新的通知由ContentResolver的notifyChange函数触发。
2. AccountManagerService
AccountManagerService负责管理手机中用户的online账户,主要工作涉及账户的添加和删除、AuthToken(全称为authentication token。有了它,客户端就无须每次操作都向服务器发送密码了)的获取和更新等。
2.1 AccountManagerService构造和初始化
注册AccountManagerService到ServiceManager,服务名为“account”
在AccountManagerService构造函数中创建了一个AccountAuthenticatorCache对象,它是什么?
2.1.1 AccountAuthenticatorCache
AccountAuthenticatorCache是Android平台中账户验证服务(Account AuthenticatorService,AAS)的管理中心。而AAS则由应用程序通过在AndroidManifest.xml中输出符合指定要求的Service信息而来。稍后读者将看到这些要求的具体格式。
2.1.1.1 AAS 解析和输入输出举例
在Email应用的AndroidManifest.xml中定义了一个AAS,如下:
在Email中这个