跟着Innost理解下数据更新、数据同步

本文深入探讨了Android中的数据更新通知机制,通过ContentService的生成和初始化、ContentResolver的registerContentObserver以及notifyChange函数,阐述了数据变化如何高效通知。接着,分析了AccountManagerService在账户管理中的角色,尤其是添加账户的过程。最后,详细介绍了SyncManager在数据同步管理中的作用,包括SyncStorageEngine、SyncAdaptersCache和SyncQueue等组件的功能。整个分析旨在帮助开发者理解Android系统中数据同步和服务交互的底层实现。
摘要由CSDN通过智能技术生成

本章将先分析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中这个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值