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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Miracast是一种用于无线传输音视频数据的技术,它包括发送端(Source)和接收端(Sink)。发送端负责音视频数据的采集、编码和发送,而接收端负责接收并解码显示音视频码流。这两个端之间通过Wi-Fi Direct技术进行连接。\[2\] Wi-Fi Display是Miracast的认证名称,通过Miracast认证的设备将在最大程度上保持对Wi-Fi Display功能的支持和兼容。Wi-Fi Display的核心功能是通过Wi-Fi无线网络来分享视音频数据。例如,使用Wi-Fi Display,手机和电视之间可以通过Wi-Fi直接传输视频,而无需使用硬连线(如HDMI)。\[3\] 所以,Miracast的发送端是Source,负责发送音视频数据;而接收端是Sink,负责接收并显示音视频数据。 #### 引用[.reference_title] - *1* *3* [Android Wi-Fi Display(Miracast)介绍](https://blog.csdn.net/Innost/article/details/8474683)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Miracast技术详解(一):Wi-Fi Display](https://blog.csdn.net/qq_27061049/article/details/125546677)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值