LBS系统架构分析

LBS系统架构分析
1.    LBS系统架构
LBS系统分为三⼤部分:
1) 第⼀部分为LBS客户端管理部分,主要提供给客户端应⽤使⽤,客户端应⽤调⽤此部分提供的功能进⾏位置定位
LocationManager,提供给客户端应⽤调⽤,获取位置等信息,同时当有位置信息变化时通知客户端应⽤。
LocationListener,提供给客户端应⽤注册使⽤,每个客户端应⽤对应⼀个LocationListener,通过LocationManager注册到系统维护的⼀个位置服务的链表中,当系统中发现有位置信息变化或者其它信息变化时,会通过它通知客户端应⽤。
霍夫曼降解
GpsStatus,提供给客户端应⽤获取GPS定位服务的状态。
GeoCoder,提供给客户端应⽤调⽤,获取地理编码信息。
2)第⼆部分为LBS系统服务部分,开机时启动此服务LocationManagerService,⼀⽅⾯负责处理LBS客户端管理提供的定位等功能需求,另⼀⽅⾯启动提供定位功能的功能模块
3)第三部分为LBS的定位功能服务部分,完成定位服务模块的定位等动能。
GpsLocationProvider,提供GPS定位服务,通过GPS底层模块获取位置信息及状态变化,通知LBS系统服务来获取位置信息及状态变化等。
LocationProviderProxy,提供⽹路定位服务,会通过ILocationProvider调⽤LocationProvider提供的定位功能。LocationProvider 只是提供了⼀个抽象的定位服务模块,并没有真正实现定位功能,需要⽤户去实现继承LocationProvider来完成此功能。
GeocodeProxy,提供地址编码服务,会通过IGeocodeProvider调⽤GeocodeProvider提供的正反向地址编码功能。GeocodeProvider 只提供了⼀个抽象的反向地址编码服务模块,根据经纬度来获取地址信息,它并没有真正实现反向地址编码功能,需要⽤户去实现继承GeocodeProvider来完成此功能。
2.    LBS⽬录结构
(1)  frameworks/base/services/java/com.android.server/LocationManager.java
提供的系统定位服务类。
(2)  frameworks/base/services/java/com.android.server.location/
提供给系统定位服务使⽤的相关类。
(3)  frameworks/base/location/lib/java/com.android.location.provider/
提供的抽象定位服务模块类以及地址编码服务模块类。供⽤户继续以实现某种定位功能。
(4)  frameworks/base/location/java/android.location
提供给客户端使⽤的定位服务相关类。
3.    LBS定位服务流程
3.1. 启动系统定位服务
开机后由系统启动系统定位服务LocationManagerService。
1)  加载和启动提供定位服务的各个定位模块LocationProviderInterface;
2)  注册⽹络更新;
3)  注册包管理更新,监听设置变化信息,获取各个定位模块可⽤信息。
3.2. 客户端应⽤注册监听
客户端应⽤实现LocationListener接⼝,通过LocationManager传递给LocationManagerService⼀个注册,当定位模块有状态变化或者位置变化等信息变化时,定位模块会通知LocationManagerService,LocationManagerService再通过该把信息变化发给对应的客户端应⽤,然后客户端应⽤再进⾏相应的处理。
1)客户端应⽤调⽤questLocationUpdates(Stringprovider,..., ILocationListener listener);
客户端会实现⼀个接⼝LocationListener,封装在ILocationListener中,通过参数传⼊上⾯的函数中,进⾏注册回调。
2)Reiver(ILocationListenerlistener);根据ILocationListener⽣成Receiver,并加⼊到LocationManagerService维护的⼀个HashMap<ILocationListener,Receiver>列表中。 当LocationManagerService发现有位置、状态等信息变化时,调⽤该列表中的各个Receiver,通知客户端应⽤对应的。
3)questLocationLocked(Stringprovider,…,Receiver receiver);创建⼀个UpdateRecord(provider,…,receiver,uid),记录客户端监听的记录,存⼊到LocationManagerService维护的HashMap<String provider,
ArrayList<UpdateRecord>>中,记录客户端对每个定位功能模块provider的位置监听记录。
3.3. 系统定位服务通知状态或者位置变化
当LocationMangerService收到定位功能模块传来的状态或位置等信息变化时,会更新保存的状态或者位置信息,同时通知客户端列表中的各个客户端。
以位置变化为例:
1)当定位模块获取到位置信息变化时,调⽤portLocaiton(Localtion);
2) LocationManagerService通知其它的定位模块LocationProviderInterface去更新位置信
息,LocationProviderInterface.updateLocation(Location);
3)取出客户端列表中的各个Receiver,更新位置信息,调⽤
Receiver.callLocationChangedLocked (Locatlion);
调⽤客户端提供的回调函数接⼝:
4)  客户端应⽤更新位置信息:
LocationChanged(Location);麦子店街道办事处
调⽤LocationChanged(Location);更新客户端应⽤所需要的位置信息。
4.    LBS⽹络定位
4.1. LBS系统定位服务初始化⽹络定位服务
1)获取⽹络定位模块的包名
在LocationManagerService(…) 中
mNetworkLocationProviderPackageName =String(
com.android.internal.fig_networkLocationProvider);
2)创建和启动⽹络定位模块
在LocationManagerService._loadProvidersLocked()中,
如果⽹络定位模块的包名不为空,则:建筑风水论文
创建⼀个LocationProviderProxy(LocationManager.NETWORK_PROVIDER,
mNetworkLocationProviderPackageName, …);
调⽤addProvider(…),将其加⼊到LocationManagerService维护的定位模块列表中,以提供具体的定位服务。
3)LocationProviderProxy在创建时,通过调⽤bindService(…, ServiceConnection, Context.BIND_AUTO_CREATE),启动绑定mNetworkLocationProviderPackageName对应的⽹络定位服务,与此服务创建⼀个连接,创建成功后,会执⾏:
ServiceConnected(ComponentName className,IBinder service),获取⽹络定位服务模块传过来的调⽤接⼝ILocationProvider。
4.2. ⽹络定位服务的实现和启动
1)实现⽹络定位模块
LocationProvider为⽹络定位的基类,外部需要继承并实现它; LocationProvider中创建了⼀个接⼝类 ILocationProvider,⽤于与LBS系统服务交互。
2)启动⽹络定位模块
LocationProviderProxy启动⽹络定位服务模块,⽹络定位服务模块创建LocationProvider,
并与之建⽴连接; ⽹络定位服务启动成功后,会传给LocationProviderProxy 已经创建好的ILocationProvider对象。
4.3. 系统定位服务调⽤⽹络定位模块
LocationManagerService会调⽤ILocationProvider的接⼝函数,进⽽调⽤到LocationProvider的函数。
5.    LBS地址编码
5.1. 系统定位服务中初始化
1)获取地址编码模块的包名
在LocationManagerService(…) 中
mGeocodeProviderPackageName= String(
唐山穆斯林com.android.internal.fig_geocodeProvider);
2)创建和启动地址编码模块
在LocationManagerService._loadProvidersLocked()中,
如果地址编码模块的包名不为空,则:
创建⼀个GeocoderProxy(mGeocodeProviderPackageName)。
3)GeocoderProxy在创建时,通过调⽤bindService(…, ServiceConnection, Context.BIND_AUTO_CREATE), 启动mGeocodeProviderPackageName对应的地址编码服务,与此服务创建⼀个连接,创建成功后,会执⾏:
ServiceConnected(ComponentNameclassName, IBinder servi舒玉泰
ce),获取地址编码模块传过来的调⽤接⼝IGeocodeProvider。
5.2. 地址编码模块的实现和启动
1)实现地址编码模块
GeocodeProvider为地址编码模块的基类,外部需要继承并实现它;
GeocodeProvider中创建了⼀个接⼝类 IGeocodeProvider,⽤于与LBS系统服务交互。
2)启动地址编码模块
GeocoderProxy启动地址编码模块GeocodeProvider,
并与之建⽴连接; GeocodeProvider启动成功后,会通过getBinder() 传给GeocoderProxy已经创建好的IGeocodeProvider对象。
5.3. 系统定位服务调⽤地址编码模块朝华mp3
LocationManagerService中的GeocodeProxy会调⽤IGeocodeProvider的接⼝函数,进⽽调⽤到GeocodeProvider的函数。

本文发布于:2024-09-21 17:33:57,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/487550.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:定位   服务   模块   客户端
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议