Android Telephony分析(七) ---- 接口扩展(异步转同步)
来源:互联网 发布:cf数据异常得多长时间 编辑:程序博客网 时间:2024/05/30 04:28
本文是基于上一篇《Android Telephony分析(六) —- 接口扩展(实践篇)》来写的。
上一篇介绍的接口扩展的方法需要实现两部分代码:
1. 从APP至RIL,发送请求;
2. 从RIL至APP,上报结果。
由于这是一个异步请求,所以两部分流程都不能少,导致流程过于复杂。
而本文的目的就是为了将异步请求转换成同步请求,节省第二部分“上报结果”的流程,从而简化整个接口扩展的流程和代码量。(当然,虽然《Android Telephony分析(六) —- 接口扩展(实践篇)》代码流程复杂了些,但是它综合较多的知识点,其自身的价值还是有的。)
1. 具体的代码实现
1.1 扩展CommandsInterface接口
同《Android Telephony分析(六) —- 接口扩展(实践篇)》1.1小节。
1.2 扩展PhoneInternalInterface接口
同《Android Telephony分析(六) —- 接口扩展(实践篇)》1.2小节。
假如现在Phone.java (frameworks\opt\telephony\src\java\com\Android\internal\telephony)中已有两个可用的接口:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
1.3 扩展ITelephony接口
先在ITelephony.aidl(frameworks\base\telephony\java\com\android\internal\telephony)中新增接口:
- 1
- 2
- 1
- 2
请注意,此时接口的返回值已不再是void。
在PhoneInterfaceManager.java (packages\services\telephony\src\com\android\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
同时需要定义四个消息:
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
以及在内部类MainThreadHandler的handleMessage()方法中添加对这四个消息的处理:
- 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
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 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
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
在PhoneInterfaceManager.java中的代码是本文的核心。在sendRequest()方法中会进入死循环,调用object.wait()强行阻塞线程,直到modem返回结果上来后,object的notifyAll()才停止,最后直接把结果返回给APP,所以这就是将异步请求强行转换成同步的解决方案。
sendRequest()方法是android原生的,不用我们添加代码:
- 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
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 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
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
接着在TelephonyManager.java (frameworks\base\telephony\java\android\telephony)中封装Phone Service的方法:
- 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
- 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
整个过程的时序图如下:
2. APP如何使用接口
在APP中可以这样调用并调试接口:
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
在APP侧来看,确实简单省事了很多,调用接口就可以马上得到返回值,但是有点需要注意的是,为了防止这种接口阻塞主线程,所以最好在子线程中调用这类接口。
3. 总结
将异步请求转换成同步请求,紧紧依赖着Object类的wait和notifyAll方法才能实现。当然Android代码中不仅仅只有PhoneInterfaceManager.java这个地方使用了这种方法,高通也实现了类似的代码提供API给APP侧调用,进而可以动态修改某些NV的值,这里只能点到为止。最后附上wait和notifyAll方法的详解:
void wait() :
导致线程进入等待状态,直到它被其他线程通过notify()或者notifyAll唤醒。该方法只能在同步方法中调用。如果当前线程不是锁的持有者,该方法抛出一个IllegalMonitorStateException异常。
void notifyAll() :
解除所有那些在该对象上调用wait方法的线程的阻塞状态。该方法只能在同步方法或同步块内部调用。如果当前线程不是锁的持有者,该方法抛出一个IllegalMonitorStateException异常。
原文地址: http://blog.csdn.net/linyongan/article/details/52189217
- Android Telephony分析(七) ---- 接口扩展(异步转同步)
- Android Telephony分析(七) ---- 接口扩展(异步转同步)
- Android Telephony分析(六) ---- 接口扩展(实践篇)
- Android Telephony分析(六) ---- 接口扩展(实践篇)
- Android Telephony 分析【全】
- Android Telephony 框架分析
- Android Telephony 分析[PART I]
- Android Telephony 分析[PART IV]
- Android 6.0 telephony 状态分析
- (N)Telephony分析(七)之DataConnection建立
- Android Telephony启动过程源码分析
- 学着分析android framework telephony
- Android Telephony分析(一) ---- Phone详解
- Android Telephony分析(二) ---- RegistrantList详解
- Android Telephony分析(三) ---- RILJ详解
- Android Telephony分析(四) ---- TelephonyManager详解
- Android Telephony分析(五) ---- TelephonyRegistry详解
- Android Telephony分析(一) ---- Phone详解
- Dagger2实现依赖注入之深入探究
- 读取文件
- Excel中对比两列数据的不同并做特殊标记
- 从一个文件读取数据然后写入另一个文件
- 关于mybatis+spring的org.apache.ibatis.binding.BindingException: Invalid bound statement错误
- Android Telephony分析(七) ---- 接口扩展(异步转同步)
- 删除文件夹下所有文件
- SOCKET的封包与拆包
- MySQL字符串中数字排序的问题
- 微信支付的那些坑
- HTML标签<label></label>标签有什么作用?
- 关键字加亮--JS方法
- android SDK manager 无法获取更新版本列表
- LabelValueBean的使用