6,彩信发送流程

发送彩信可以调用MmsManager.java的sendMultimediaMessage方法就可以发送彩信。

CTS 测试彩信部分代码如下,

final SmsManager smsManager = SmsManager.getDefault();
•••
smsManager.sendMultimediaMessage(context,contentUri, null/*locationUrl*/, null/*configOverrides*/, pendingIntent);

当然,还有通过蓝牙也可以发送彩信, packages/apps/Bluetooth的BluetoothMapContentObserver.java 方法也会调用这个接口发送彩信。

6.1 binder对象获取

MmsManager.java的sendMultimediaMessage方法调用流程图如下,

sendMultimediaMessage方法逻辑如下,

1,首先获取Imms对应的binder对象,

final IMms iMms = IMms.Stub.asInterface(ServiceManager.getService("imms"));

2,然后调用其sendMessage方法,

iMms.sendMessage(getSubscriptionId(), ActivityThread.currentPackageName(), contentUri,locationUrl, configOverrides, sentIntent);

现在的问题是, imms 对应的是哪个binder对象呢?

在frameworks\base\services\core\java\com\android\server路径下的MmsServiceBroker的onStart方法中,

publishBinderService("imms", new BinderService());

MmsServiceBroker继承SystemService,

public class MmsServiceBroker extends SystemService {

并且将BinderService对象设置为imms对应的binder对象, BinderService是MmsServiceBroker的内部类,

BinderService是一个binder对象,定义如下,

private final class BinderService extends IMms.Stub {

因此, MmsManager的sendMultimediaMessage方法获取的Imms对象其实就是MmsServiceBroker的内部类BinderService对象。

BinderService的sendMessage方法逻辑如下,

1,调用adjustUriForUserAndGrantPermission方法进行权限检查,

contentUri = adjustUriForUserAndGrantPermission(contentUri,CarrierMessagingService.SERVICE_INTERFACE,Intent.FLAG_GRANT_READ_URI_PERMISSION);

2,调用getServiceGuarded方法获取phone进程的MmsService的内部类mStub,

然后调用mStub的sendMessage方法发送彩信,

getServiceGuarded().sendMessage(subId, callingPkg, contentUri, locationUrl,configOverrides, sentIntent);

getServiceGuarded方法如下,

1,调用getOrConnectService方法获取binder对象,

final IMms service = getOrConnectService();
if (service != null) {return service;
}

2,如果获取失败,直接返回内部类对象mServiceStubForFailure,

return mServiceStubForFailure;

getOrConnectService方法逻辑如下,

1,如果mService变量不为空,说明已经获取了phone进程的Imms binder对象,直接返回该对象,

if (mService != null) {return mService;
}

2,切换到UI线程中获取phone进程的Imms binder对象,

mConnectionHandler.sendMessage(mConnectionHandler.obtainMessage(MSG_TRY_CONNECTING));

3,与此同时,进行休眠,4s之后再次判断是否获取成功,

final long shouldEnd =SystemClock.elapsedRealtime() + SERVICE_CONNECTION_WAIT_TIME_MS;
long waitTime = SERVICE_CONNECTION_WAIT_TIME_MS;

SERVICE_CONNECTION_WAIT_TIME_Ms定义如下,

private static final long SERVICE_CONNECTION_WAIT_TIME_MS = 4 * 1000L;

等待4s,

while (waitTime > 0) {try {// TODO: consider using Java concurrent construct instead of raw object waitthis.wait(waitTime);

4s之后再次检查mService变量是否赋值,也就是是否成功获取,

if (mService != null) {// Successreturn mService;
}

如果未成功获取,最后返回空,

return null;

内部变量mConnectionHandler对MSG_TRY_CONNECTING消息处理如下,

case MSG_TRY_CONNECTING:tryConnecting();break;

tryConnecting方法如下,

final Intent intent = new Intent();
intent.setComponent(MMS_SERVICE_COMPONENT);
try {if (!mContext.bindService(intent, mConnection, Context.BIND_AUTO_CREATE)) {

MMS_SERVICE_COMPONENT  定义如下,

private static final ComponentName MMS_SERVICE_COMPONENT =new ComponentName("com.android.mms.service", "com.android.mms.service.MmsService");

因此,启动的是MmsService。

mConnection匿名内部类如下,

private ServiceConnection mConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {Slog.i(TAG, "MmsService connected");synchronized (MmsServiceBroker.this) {mService = IMms.Stub.asInterface(service);MmsServiceBroker.this.notifyAll();}
•••

一旦绑定成功,就为mService赋值, mService到底是什么对象呢?

packages\services\Mms\src\com\android\mms\service路径下的MmsService对应的AndroidManifest.xml如下,

<application android:label="MmsService"android:process="com.android.phone"
•••

因此, MmsService以及有关代码运行于phone进程中。

MmsService的onBind方法如下,

return mStub;

mStub也是IMms的binder对象,定义如下,

private IMms.Stub mStub = new IMms.Stub() {

因此,BinderService的mService变量指向的是MmsService的mStub变量。

MmsServiceBroker的内部类BinderService的sendMessage方法最后会跨进程调用MmsService的mStub变量的sendMessage方法。

小结:这里面涉及到2次跨进程的binder调用。第一次是从应用app跨进程调用到systemserver进程,然后从systemserver进程跨进程调用到phone进程。

当然, MmsService的mStub变量不仅有sendMessage方法,而且还有一些其他的方法,例如下载彩信等等。

当然,如果发送失败,会在MmsServiceBroker中调用mServiceStubForFailure的sendMessage将广播发送出去。

这样,应用app就可以处理了,前提是应用app在调用MmsManager.java的sendMultimediaMessage方法发送彩信是最后一个参数不为空。

彩信发送流程 --- 之一相关推荐

  1. 彩信发送流程 --- 之二

    6.2 发送流程分析 MmsService的mStub变量的sendMessage方法调用流程图如下, sendMessage方法主要逻辑如下, 1,将要发送的内容等信息封装为SendRequest对 ...

  2. android入门-MMS-短彩信发送/接收流程【图】

    短信发送流程: ConversationList --> (createNewMessage/OpenThread) --> ComposeMessageActivity(confirmS ...

  3. 高通android 7.0彩信发送过程中使用到的google pdu

    对于彩信与数据库的交互操作,google并没有将这部分代码放在Mms中,而是放在framework中的pdu部分. 具体代码路径是在:opt\telephony\src\java\com\google ...

  4. Android9.0 短信发送和彩信接受流程

    文章目录 一.短信发送流程 二.彩信接受流程 三.接收彩信的解析 一.短信发送流程 在短信发送界面点击发送按钮后(ComposeMessageActivity响应OnClick),ComposeMes ...

  5. Android短彩信源码解析-短信发送流程(一)

    转载请注明出处:http://blog.csdn.net/droyon/article/details/10194591 源码版本来自:Android4.0.3 忙了两三个月,终于有时间可以写点东西了 ...

  6. 彩信发送和接收关键流程

    MMS 的设计基于WAP协议: DataConnection 手机上网数据连接,其中5种常用类型的APN配置信息中就有MMS类型,即收发彩信时需要建立手机上网数据连接: MMS发送和接收,就是Tran ...

  7. Android短信发送流程之多收件人发送(原)

    前面的< Android短信发送流程之长短信发送 >中介绍了长短信对于普通短信的区别,而对于多收件人的情况,在SmsMessageSender的queueMessage()方法中我们了解到 ...

  8. Android短信发送流程之普通短信发送(原)

    我们先来看最简单的流程入手分析,即收件人只有一个,而且不是长短信的情况. 一.地址有效性检测 当点击发送按钮时,触发onClick事件: [java] view plaincopy @ComposeM ...

  9. Android短信彩信收发流程(应用层)

    下图为ComposeMessageActivity中confirmSendMessageIfNeeded部分的信息发送流程.主要以接收者有效性的确认为主,然后转向sendMessage方法进行发送. ...

最新文章

  1. Python学习笔记:线程和进程(合),分布式进程
  2. 万字长文|线性代数的本质课程笔记完整合集!
  3. 将任意图像转成 HTML5 Canvas
  4. RK3288 制作内核开机logo
  5. php odbc 结果集处理,php常用ODBC函数集的简单示例
  6. Node.JS——NodeJS引用路径的小问题
  7. 全网首发:明明已安装也存在,报错找不到lualib.h
  8. 通过文件名快速查找电脑中的文件
  9. setuna截图软件怎么用_苹果手机笔记怎么做?用哪款笔记软件好
  10. 什么时候开始论文查重?
  11. Linux perf 事件调度算法
  12. 【转】高通平台android 环境配置编译及开发经验总结
  13. 开源图像数据集管理工具fiftyone使用
  14. 硅谷性能服务器介绍,美国RAKsmart服务器优势特点介绍
  15. 原生Python实现KNN算法,并用鸢尾花(iris)数据集测试
  16. 什么是扇入?什么是扇出?
  17. 智慧工地给工地装上“最强大脑”
  18. Java实现京东登录
  19. 视频直播技术详解之现代播放器原理
  20. html简单歌词同步教程,HTML5实现歌词同步(示例代码)

热门文章

  1. 联想ideapad700-15isk(小新线下版)黑苹果完美驱动附详细安装过程
  2. c语言程序中超联赛,同济大学2018年数学建模竞赛C题中超联赛-同济大学数学系.PDF...
  3. linux搭建nexus私服仓库并简单使用
  4. 国外php开源采购系统,国外PHP开源CMS系统一览
  5. 解决EasyExcel创建excel下拉框,下拉框内容过多时不显示的问题
  6. 续修家谱没意义?专家:9成大家族修谱都会遇到这三个难题!
  7. 工业用绝缘监测装置-IT系统的绝缘监测和绝缘故障定位
  8. 使用putty的pscp与服务器上传下载文件
  9. win10系统5小时休眠—windows日志查看 判断非法关机
  10. 杰理之扫描设备【篇】