Android Telephony分析(四) ---- TelephonyManager详解
来源:互联网 发布:js产生1到3随机数 编辑:程序博客网 时间:2024/05/16 01:36
前言
TelephonyManager主要提供Telephony相关信息的查询/修改功能,以及Phone状态监听功能,封装的方法主要是提供给APP上层使用。
TelephonyManager.java 在frameworks\base\telephony\java\Android\telephony目录下。
1. TelephonyManager整体结构
从TelephonyManager导入的文件中可以发现有四个接口
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
分别对应下面这几个AIDL接口:
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
所以可以猜测到,在TelephonyManager中可以得到这四种Service。
通过所有文件中搜索”extends 接口名.Stub”,如”extends ITelephony.Stub”,可以找到是哪些类实现了上面四个AIDL接口中的方法,整理可得:
在TelephonyManager中搜索”接口名.Stub.asInterface”,如”ITelephony.Stub.asInterface”,可以找到这四个Service的名字,整理可得:
好了,下面分别对这四种Service进行分析:
1.1 TelecomServiceImpl—Telecom Service
服务端TelecomServiceImpl中有mBinderImpl实现了ITelecomService接口中的方法
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
在TelecomLoaderService.java中,TelecomServiceImpl把自己注册到ServiceManager中,
- 1
- 1
所以在TelephonyManager中可以通过ServiceManager得到Telecom Service
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
其实Telecom Service的最常用客户端是TelecomManager.java。而在TelephonyManager中由于无法得到CallManager对象,所以只能依赖Telecom Service获取Call State。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
所以,总体上来说,虽然TelecomManager得到了Telecom Service,但其实作用不大。相反,Telecom Service中会反过来得到TelephonyManager对象,进一步实现自己的方法,如在TelecomServiceImpl.java中:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
1.2 PhoneSubInfoController— “iphonesubinfo” Service
服务端PhoneSubInfoController继承自IPhoneSubInfo.Stub
- 1
- 1
在创建Default Phone对象之后,ProxyController对象在PhoneFactory.java的makeDefaultPhone()中被初始化
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
所以在TelephonyManager中可以通过ServiceManager得到”iphonesubinfo” Service
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
通过”iphonesubinfo” Service可以得到software version、deviceID、VoiceMail Number等信息,TelephonyManager在这里只是对这些方法进一步封装,这些方法具体的实现,最后还是通过Phone实例和IsimRecords实例来完成的。
以getMsisdn()方法为例,最常见的调用方式如下:
备注:在Android N中已删除PhoneSubInfo.java和PhoneSubInfoProxy.java,所以流程变得简单了。
1.3 PhoneInterfaceManager—Telephony Service
TelephonyManager依赖Telephony Service实现了大部分的方法。
PhoneInterfaceManager继承自ITelephony.Stub
- 1
- 1
PhoneInterfaceManager.java在 packages\services\telephony\src\com\android\phone目录下,显然它是运行在Phone进程中的。
在Phone进程启动时,Default Phone对象创建完之后,PhoneInterfaceManager对象在PhoneGlobals的onCreate()中被初始化:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
在PhoneInterfaceManager的构造方法中:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
在PhoneInterfaceManager初始化的时候,把自己注册成SystemServer,这样客户端(如TelephonyManager)则可以通过ServiceManager把它取出来。
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
PhoneInterfaceManager中的方法,最后还是通过Phone实例来实现。
以isImsRegistered()方法为例,最常见的调用方式如下:
1.4 TelephonyRegistry—“telephony.registry” Service
TelephonyRegistry继承自ITelephonyRegistry.Stub
- 1
- 1
在SystemServer.java中,
- 1
- 2
- 3
- 1
- 2
- 3
所以在TelephonyManager中可以通过ServiceManager得到”telephony.registry” Service
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
TelephonyManager主要利用”telephony.registry” Service实现listen()方法,实现对Phone状态的监听的功能
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
关于TelephonyRegistry,后续的文章会详细讲,目前先不用太关注。
2. 如何得到TelephonyManager对象
1、 假如没有Context,可以通过:
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
2、如果能得到Context对象,可以通过:
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
3. 其他重要方法
TelephonyManager还提供了两个其他比较重要的方法:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
这样子就可以实现对于同一个key,不同phoneId可以存储不同的值。
原文地址: http://blog.csdn.net/linyongan/article/details/52104394
- Android Telephony分析(四) ---- TelephonyManager详解
- Android Telephony分析(四) ---- TelephonyManager详解
- Android Telephony分析(四)--- TelephonyManager 详解
- Android Telephony分析(一) ---- Phone详解
- Android Telephony分析(二) ---- RegistrantList详解
- Android Telephony分析(三) ---- RILJ详解
- Android Telephony分析(五) ---- TelephonyRegistry详解
- Android Telephony分析(一) ---- Phone详解
- Android Telephony分析(二) ---- RegistrantList详解
- Android Telephony分析(三) ---- RILJ详解
- Android Telephony分析(五) ---- TelephonyRegistry详解
- Android Telephony分析(一) ---- Phone详解
- Android Telephony分析(一)--- Phone 详解
- Android Telephony分析(二)--- RegistrantList详解
- Android Telephony分析(三)--- RILJ 详解
- Android Telephony分析(五)--- TelephonyRegistry 详解
- Android Telephony分析(二) ---- RegistrantList详解
- Android Telephony分析(三) ---- RILJ详解
- Java虚拟机--常用的GC参数(十)
- javasctipt 数组原生方法大集合
- 【Java8】Guava——Preconditions
- memcached与redis实现的对比
- H3C S6800交换机基本配置命令
- Android Telephony分析(四) ---- TelephonyManager详解
- 训练CNN你需要知道的tricks/tips
- 程序员日常工作英文记录 20170410
- Dijkstra算法
- getAttribute和getParameter的区别
- Java 反射机制应用实践
- 如何做时间估算--计划纸牌
- pyqt signal slot thread 多线程
- QT error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __thiscall Widget::metaObjec