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. 测试人员在需求阶段应做哪些工作
  2. DataWorks搬站方案:Azkaban作业迁移至DataWorks
  3. 这么画c语言编程流程图,我想问一下这两个C语言的流程图像图中这么画吗?
  4. C# 数据库连接字符串集合
  5. Linux中对进程的管理
  6. 每天学一点flash(75) ToolTip 提示
  7. 检测到目标主机可能存在缓慢的http拒绝服务攻击_高防服务器能防住哪些攻击?“流量清洗”与它有什么关系?...
  8. java future 不足_java Future用法和意义一句话击破
  9. VirtualBox配置
  10. linux常用命令集(用户和组操作-共15个)
  11. idea集成svn问题
  12. 元宇宙价值链解读:元宇宙现实体系映射对未来的影响
  13. MAC配置thinkPHP的心路历程(课设vue-tpadmin商城)
  14. 怎么改变图片的尺寸?教你在线修改图片尺寸大小
  15. getlasterror 126
  16. rabbitmq高并发RPC调用,你Get到了吗?
  17. JavaScript 读写剪贴板之方式汇总
  18. 【JMeter】后置处理器之JSON提取器
  19. win10睡眠按啥键唤醒_win10关闭屏幕后无法唤醒怎么办?电脑黑屏只能重启的解决方法...
  20. 100 道 Linux 常见面试题,建议收藏!

热门文章

  1. 现在分词的完成与一般式区别
  2. 尚硅谷谷粒商城第十六天 支付、秒杀
  3. 那些年被HR虐过的面试题,你是怎么回答的
  4. Asix2搭建Spring-MVC的WebService
  5. wandb的pip安装、离线安装和基础总结
  6. SVN_一个开源的版本管理软件
  7. 【Mac】python调用ImageMagick
  8. 易优CMS:compare的基础用法
  9. 转载:德国人信奉的人生哲理
  10. 自组网中继台_解决方案 无人机无线中继组网_Mesh自组网,无线自组网电台,mesh自组网单兵,自组网设备,无人机图传电台,应急通信自组网基站,COFDM MESH芯片厂家...