Android GPS架构分析(一)

Android GPS架构分析
Daniel Wood 20101222
转载时请注明出处和作者
文章出处:http://danielwood.cublog.cn
作者:Daniel Wood
--------------------------------------------------------------------
   介绍完了主体代码结构以及重要的数据结构后,下面来看看gps的定位服务(LocationManager)的启动过程。我总是喜欢追本溯源地从源头去认识事物。因为“人之初,性本善”,从事物的本性去认识事物。
LocationManager 这项服务是在SystemServer.java 中启动的,也就是系统启动之后,这个服务就已经启动了:

systemServer.java [framework/base/services/java/com/android/server]

SystemServer.java init2 函数中启动了一个线程来注册 Android 的诸多服务,如: Bluetooth Service NetworkManagement Service Notification Manager 等,当然也包括 Location Service

SystemServer.java [frameworks/base/services/java/com/android/server]

public static final void init2( ) {
        Slog. i( TAG, "Entered the Android system server!" ) ;
        Thread thr = new ServerThread( ) ;
        thr. setName ( "android.server.ServerThread" ) ;
        thr. start ( ) ;
}

ServerThread 线程的 run 函数中 LocationManager 服务的代码段如下:

2. 1版本
try {
                Log . i( TAG, "Location Manager" ) ;
                ServiceManager. addService ( Context . LOCATION_SERVICE, new LocationManagerService( context ) ) ;
            } catch ( Throwable e) {
                Log . e( TAG, "Failure starting Location Manager" , e) ;
            }
2. 2的代码中代码段如下形式:
       try {
                Slog. i( TAG, "Location Manager" ) ;
                location = new LocationManagerService( context ) ;
                ServiceManager. addService ( Context . LOCATION_SERVICE, location ) ;
            } catch ( Throwable e) {
                Slog. e( TAG, "Failure starting Location Manager

run 函数的后半部分,是服务对系统的反馈,就是 systemReady() 函数。 LocationManager 服务的反馈函数如下:

if ( locationF ! = null ) locationF. systemReady( ) ;

其中的 locationF LocationManagerService final 类型,就是一旦赋值,不能更改。

final LocationManagerService locationF = location ;

哇! locationManager 这项服务的反馈机制只在 2.2 的代码里面才有啊。 2.1 中的反馈机制中并没有 locationManager (当然有其他的服务反馈)。

而在 2.1 版本中 LocationManagerService 的构造函数如下:

LocationManagerService.java [frameworks/base/services/java/com/android/server]

public LocationManagerService( Context context ) {
        super ( ) ;
        mContext = context ;
        Thread thread = new Thread ( null , this , "LocationManagerService" ) ;
        thread . start ( ) ;
        if ( LOCAL_LOGV) {
            Log . v( TAG, "Constructed LocationManager Service" ) ;
        }
    }


2.2版本

public LocationManagerService( Context context ) {
        super ( ) ;
mContext = context ;
        if ( LOCAL_LOGV) {
            Slog. v( TAG, "Constructed LocationManager Service" ) ;
        }
    }

2.1 是在构造函数的时候就启动一个自身服务线程。见构造函数。

2.2 是在反馈机制中通过 systemReady 函数启动自身服务线程。如下:

void systemReady( ) {
        // we defer starting up the service until the system is ready 
        Thread thread = new Thread ( null , this , "LocationManagerService" ) ;
        thread . start ( ) ;
    }

通过线程 run 函数,调用 initialize 函数 :

public void run ( )
    {
        Process . setThreadPriority( Process . THREAD_PRIORITY_BACKGROUND) ;
        Looper. prepare ( ) ;
        mLocationHandler = new LocationWorkerHandler( ) ;
        initialize ( ) ;
        Looper. loop ( ) ;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值