Android Call 功能在各个frameworks层中的结构整理 (一)

Android的Call功能的AP部分大体上可以认为是由APPàframeworksàRIL三块部分组成。我所负责的frameworks层沟通上下两大模块。因此,对于上下两部分的代码与接口实现都需要有一定了解。首先,我来整理一下关于Call部分frameworks层相关的代码实现逻辑。该部分代码主要以原生的android 2.3.7为例进行分析,在最后部分,会针对4.0的代码做一个概要性的区别分析。

 

       最初接触该部分逻辑是从VoiceCall的dail功能代码开始的。所以,同样以frameworks侧的dail部分为索引,对Call业务做一个梳理。

 

 

       由于一些android功能上的特性安排,本文的分析顺序自底向上。

 

1.     Ril.java类

       需要理解的若干概念:Handler,message

 

        RIL.java是ril功能在frameworks层的一个抽象实现,网络上关于该类代码的分析数不胜数,更说明了它的重要性。然而对于Call功能而言,RIL.java的作用更像是层层包裹下的糖果,frameworks层做了种种的条件判断或者是数据包装,最终的目的都是调用这个类中的方法,将app的数据需求传到CP侧,或者是将CP的消息取过来上传到app。

 

        RIL.java与rild的通信方式为socket,这一点本文并不关注。因为对于frameworks层而言,最终送出去的消息以什么形式进行包装并不重要,需要关注的应该是RIL.java需要什么样的数据来填充消息,以及它是如何接收上层消息或是捕获底层消息的。

 

       这样一来,不得不提到的就是android的Handler机制。

 

Handler及其相关概念

       关于Handler及其相关概念,可以从这张图上有一个比较直观的理解。


     (来自blog.csdn.net/stefzeus/article/details/6187337)

 

       简单来说,就是Handler从消息池(mPool)中,通过obtain方法取得消息后,用sendMessage(msg)方法将其送入队列MessageQueue中。另一方面,looper通过loop()方法,将MessageQueue中等待处理的消息(Message)取出,并调用对应的msg.target.dispatchMessage()来达到消息分发的目的。从而完成消息的异步处理。

 

       RIL.java类处于telephony/framework最底层,与rild通过socket直接联系。其有两个重要的内部类,RILSender与RILReceiver。

       RILSender继承Handler类,实现Runnable接口。从构造函数

                      PublicRILSender(Looper looper){}

      可以看出,它实际是通过 public Handler(Looper looper)来完成线程的初始化的。通过这个looper作为连结点,msg在被送入looper.mQueue中后又被RILSender.dispatchMessage(msg)分发,最终交由RILSender.handleMessage(msg)来处理对应消息。


       RILSender的作用是将frameworks层下发的消息,以socket方式送到rild侧,最终以AT指令或者是其他的方式发送到服务器端。这个过程是消息的派送。

       而RILReceiver,顾名思义,即为消息的接收。这个线程主要负责接收从rild侧发来的socket的消息,从逻辑上来看即是一个不停轮询端口直至接收消息的过程。

这两套线程的启动都放在RIL.java的构造函数中。

具体的分析过程如下。

 

RIL()@RIL.java

mSenderThread = new HandlerThread("RILSender");

mSenderThread.start();

 

      mSenderThread实例化HandlerThread,start之后实际上也将loop()跑起来了。

 

Looper looper = mSenderThread.getLooper();

mSender = new RILSender(looper);

 

      从mSenderThread中取出的looper用于构造Handler,这样就把Handler

Looper以及MessageQueue绑定到一起了。

      这个构造出的mSender,同时也为Message的dispatch指定了target。这样一来,整个循环就搭起来了。



 

 


原文:http://blog.csdn.net/guiyu_1985/article/details/7282748




  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容使用说明 YOLO高分设计资源源码,详情请查看资源内容使用说明 YOLO高分设计资源源码,详情请查看资源内容使用说明 YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明
### 回答1: 在Android,可以使用以下步骤在框架增加一个带有自定义权限的服务: 1. 定义权限:定义一个新的权限,可以在AndroidManifest.xml文件添加一个新的权限声明,例如: ``` <permission android:name="com.example.myapp.MY_PERMISSION" android:label="@string/my_permission" android:description="@string/my_permission_description" android:protectionLevel="dangerous" /> ``` 这里声明了一个名为 "com.example.myapp.MY_PERMISSION" 的自定义权限,并设置了其标签、描述和保护级别。 2. 定义服务:定义一个新的服务并将其添加到AndroidManifest.xml文件,例如: ``` <service android:name=".MyService" android:permission="com.example.myapp.MY_PERMISSION" /> ``` 这里定义了一个名为 "MyService" 的服务,并将其权限设置为 "com.example.myapp.MY_PERMISSION"。 3. 实现服务:创建一个新的服务类并在其实现服务的逻辑,例如: ``` public class MyService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { // 在此处添加服务逻辑 return super.onStartCommand(intent, flags, startId); } @Override public IBinder onBind(Intent intent) { // 如果服务需要绑定,则返回一个 IBinder 实例 return null; } } ``` 在这个示例,我们创建了一个名为 "MyService" 的服务,并在其实现了 onStartCommand() 方法。可以在这个方法添加服务的逻辑。 4. 请求权限:在应用程序请求自定义权限,例如: ``` if (ContextCompat.checkSelfPermission(this, "com.example.myapp.MY_PERMISSION") != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{"com.example.myapp.MY_PERMISSION"}, REQUEST_CODE); } ``` 这里使用了 ContextCompat.checkSelfPermission() 方法检查应用程序是否具有 "com.example.myapp.MY_PERMISSION" 权限。如果没有该权限,则使用 ActivityCompat.requestPermissions() 方法请求该权限。 以上就是在Android框架增加一个带有自定义权限的服务的步骤和示例。需要注意的是,在添加自定义权限时需要遵循一定的命名规范,并且在请求权限时需要向用户解释权限的目的。 ### 回答2: 在Android frameworks增加一个带有自定义权限的服务,可以按照以下步骤进行: 1. 创建权限: - 在AndroidManifest.xml文件添加自定义权限标签,例如: <permission android:name="com.example.custompermission.MY_PERMISSION" android:protectionLevel="dangerous" /> - 在权限标签设置权限的名称和保护级别。 2. 创建服务: - 创建一个继承自android.app.Service类的自定义服务,例如: public class CustomService extends Service { ... } - 在服务类实现自定义的功能逻辑。 3. 添加权限到服务: - 在服务类的onCreate()方法检查是否授权,例如: @Override public void onCreate() { super.onCreate(); if (checkCallingOrSelfPermission("com.example.custompermission.MY_PERMISSION") != PackageManager.PERMISSION_GRANTED) { throw new SecurityException("Permission denied"); } ... } - 在服务类的其他方法使用权限来控制访问限制,例如: public void performCustomAction() { if (checkCallingOrSelfPermission("com.example.custompermission.MY_PERMISSION") != PackageManager.PERMISSION_GRANTED) { throw new SecurityException("Permission denied"); } ... } 4. 注册服务: - 在AndroidManifest.xml文件注册自定义服务,例如: <service android:name=".CustomService" android:permission="com.example.custompermission.MY_PERMISSION" /> 5. 请求权限: - 在应用程序的代码请求自定义权限,例如: if (ContextCompat.checkSelfPermission(this, "com.example.custompermission.MY_PERMISSION") != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[] {"com.example.custompermission.MY_PERMISSION"}, REQUEST_CODE); } - 当权限请求被用户确认或拒绝后,可以在Activity的onRequestPermissionsResult()方法处理权限请求结果。 以上就是在Android frameworks添加一个带有自定义权限的服务的步骤和示例。通过创建权限、服务和对权限的控制,可以有效地管理和限制应用程序的功能和资源的访问。 ### 回答3: 要在Android frameworks增加一个带有自定义权限的服务,可以按照以下步骤进行操作: 1. 在Android源码目录找到frameworks/base/目录。在该目录下,创建一个新的文件夹,用于存放自定义服务的源代码和相关文件。 2. 在新创建的文件夹,创建一个Java类作为自定义服务的实现。该类需要继承自android.app.Service类,并实现相关的方法。 3. 修改AndroidManifest.xml文件,在其注册自定义服务。在<application>标签内添加以下代码: ```xml <service android:name=".CustomService" android:permission="com.example.custom_permission" /> ``` 其,“CustomService”是自定义服务的类名,“com.example.custom_permission”是自定义权限的名称。 4. 在系统的权限文件添加自定义权限。在frameworks/base/core/res/目录下的AndroidManifest.xml文件的<permission>标签内添加以下代码: ```xml <permission android:name="com.example.custom_permission" android:protectionLevel="normal" /> ``` 其,“com.example.custom_permission”是自定义权限的名称,“normal”是权限的保护级别。可以根据实际需要修改保护级别。 5. 在自定义服务的代码,可以通过使用Context的checkPermission()方法来检查调用者是否拥有自定义权限。例如: ```java if (checkPermission("com.example.custom_permission", Binder.getCallingPid(), Binder.getCallingUid()) == PackageManager.PERMISSION_GRANTED) { // 执行服务的逻辑 } else { // 没有权限,抛出SecurityException throw new SecurityException("Permission denied"); } ``` 通过以上步骤,就可以在Android frameworks增加一个带有自定义权限的服务了。在使用该服务的应用程序,需要在AndroidManifest.xml文件声明使用自定义权限,并在运行时进行权限检查,以确保调用者具有相应的权限。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值