Android的GPS的代码分析(二)

来源:互联网 发布:php curl post请求 编辑:程序博客网 时间:2024/06/11 23:41
介绍完了主体代码结构以及重要的数据结构后,下面来看看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, newLocationManagerService( 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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 土地面积与实际面积不符怎么办 军转进省直单位双选失败怎么办 房改房楼龄到了70年怎么办 商品房房改房到70年后怎么办 公务员未享受房改政策怎么办 两套房改房违规怎么办 法院保全的物品在我家怎么办 西瓜视频答题结束了钱没提现怎么办 诚信答题密码忘了怎么办 我未成年杀了人怎么办 错过了网课考试怎么办? 2018广东省普法考试0分怎么办 小孩错过了小升初的考试怎么办 错过了自主招生考试怎么办? 科目一考试错过了时间怎么办 中学生网瘾怎么办济南远大认真 u盘安装不了系统怎么办 对敏感脆弱的青春期孩子怎么办? 脸变得很交黑怎么办 玩手机长痘痘了怎么办 青少年左侧后背突发疼痛怎么办 纵欲过度导致青少年白发怎么办 20岁了不想长大怎么办 网吧老板跑路了怎么办 网吧玩地下城卡怎么办 个人公积金封存之前厂子欠费怎么办 学生欠了2万块怎么办 玉米去完库存量cool怎么办 幸福蓝海电子券过期怎么办 幸福蓝海国际影城会员怎么办 幸福蓝海会员卡过期了怎么办 电机线圈处于平衡位置怎么办 混联电路求电功率最小怎么办 电脑超出工作频率范围怎么办 手机红外线感应器坏了怎么办 我的世界左右慢怎么办 发电机自动启停装置故障怎么办 如果自动启停没关发动机涉水怎么办 偏激的人不分手怎么办 被极端的人纠缠怎么办 对固执偏激的人怎么办