Android 基础库 - 属性系统 - 远程属性同步

属性集

功能

备注

代理属性集

转发属性方法调

 

远程属性集

远程同步属性读写

 

多播属性集

同时同步给多个进程

 

上下文属性集

读写不同上下文的属性集副本

 

客户端上下文属性集

接受多个客户端进程的属性设置

在远程进程中工作

代理属性集

代理属性集代理实际的属性集,除了转发属性方法调用给实际属性集,没有特殊功能,仅作为其他使用代理机制的属性集的基类。

代理属性集与实际的属性集使用的是同一个属性定义类。代理属性集没有自己的属性,所有属性读写都是直接作用于实际的属性集。

代理属性集的序列化,先序列化实际的属性集,再序列化自身。

远程属性集

远程属性集是一种代理属性集,除了将属性写入实际的属性集,也会同时与另一个进程的属性集同步(通过远程属性集管理)。

当以字符串Key设置属性时,因为转发到实际的属性集,不会返回到代理属性集的以属性键为Key的方法,所以不存在多次同步到远程的问题。

读取属性时,也从远程读取。

支持批量同步。

支持与实际的属性集解绑定,解绑定后,属性设置不转发给实际的属性集。

需要属性集注册的上下文名称,和属性集在上下文中的注册名称。可以先提供上下文本身,延时获取上下文名称。

同一个属性集在多个上下文注册,在同一个远程属性集管理单元登记,结果会封装一个远程属性集,并在多个上下文注册。

同一个属性集在一个上下文注册,在多个远程属性集管理单元登记,结果会封装多个远程属性集,再用一个多播属性集进行统一管理,并在该上下文注册。

同一个属性集在多个上下文注册,又在多个远程属性集管理单元登记,行为未定义。

多播属性集

多播属性集是另一种代理属性集,除了将属性值写入实际的属性集,还写入一组被其管理的属性集(一般是远程属性集,可以实现同时将修改同步给所有远程进程)。

读取属性值是,从实际的属性集读取。

添加到一起管理的属性集是远程属性集时,远程属性集与实际的属性集解绑定。

上下文属性集

上下文属性集是另一种代理属性集,根据当前环境上下文,读写不同的属性集副本。

当前的环境上下文可以通过多层上下文空间表示。全局空间是最外层空间,对应的属性集副本就是原始的实际属性集。

写入的时候同时写入所有上下文空间对应的属性集,包括全局空间。当某个空间不存在对应的属性集副本时,副本会被自己构建。

读取的时候,从内层空间向外层空间寻找属性集,从第一个被找到的属性集副本中读取属性值。

上下文属性集可以被序列化,继承代理属性集序列化机制,并增加序列化所有上下文空间中的副本。

上下文属性集相互间同步时(assign),会分上下文空间逐个同步,过程中间会自动创建副本。

上下文属性集提供方法删除消失的上下文环境。

在属性集管理中,针对上下文属性集,支持批量将特定上下文空间的属性集副本注册到属性集管理的上下文中,过程中也使用从内层空间向外层空间寻找属性集的方式。

客户端上下文属性集

客户端上下文属性集是一种上下文属性集,以客户端的用户ID和进程ID为上下文。

用户ID空间包含进程ID空间,同一个用户ID的多个进程可以共享一份属性集副本。

当外部检测的客户端连接断开后,可以删除进程ID上下文空间,用户ID上下文空间因为共享,不能删除。

远程属性集管理

远程属性集管理针对不同的服务进程,用多个管理实例分别管理,多个管理实例又基于全局的属性集管理,因此存在相互关联。

每个管理实例对应于一个服务进程的连接,管理多个远程属性集。管理实例将原始属性集映射为远程属性集(代理实际属性集),并记录和返回给外部,同时替换全局属性集管理中的注册实例。同一个原始属性集,映射为同一个远程属性集实例。

多个管理实例将同一个原始属性集,映射为不同的远程属性集实例。当多映射发生时,会创建多播属性集,管理同一个原始属性集的多个映射,并且用多播属性集替换全局属性集管理中的注册实例。

需要注意传入的属性集不一定是原始属性集,可能需要先解除封装。将同一个原始属性集传给多个管理实例,不会生成多播属性集关联。

不能Parcel序列化的属性集,不被映射,直接返回原始属性集映。

      1. 本地属性集管理

本地属性集管理与远程属性集管理很相似,都是记录属性集映射。本地属性集管理只有一个管理实例,他将原始属性集映射为客户端上下文属性集。

原始属性集定义需要主动声明为上下文相关的(继承上下文属性集的特殊接口),才能被映射。

猜你喜欢

转载自blog.csdn.net/luansxx/article/details/82852390