彩信发送流程 --- 之一
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方法发送彩信是最后一个参数不为空。
彩信发送流程 --- 之一相关推荐
- 彩信发送流程 --- 之二
6.2 发送流程分析 MmsService的mStub变量的sendMessage方法调用流程图如下, sendMessage方法主要逻辑如下, 1,将要发送的内容等信息封装为SendRequest对 ...
- android入门-MMS-短彩信发送/接收流程【图】
短信发送流程: ConversationList --> (createNewMessage/OpenThread) --> ComposeMessageActivity(confirmS ...
- 高通android 7.0彩信发送过程中使用到的google pdu
对于彩信与数据库的交互操作,google并没有将这部分代码放在Mms中,而是放在framework中的pdu部分. 具体代码路径是在:opt\telephony\src\java\com\google ...
- Android9.0 短信发送和彩信接受流程
文章目录 一.短信发送流程 二.彩信接受流程 三.接收彩信的解析 一.短信发送流程 在短信发送界面点击发送按钮后(ComposeMessageActivity响应OnClick),ComposeMes ...
- Android短彩信源码解析-短信发送流程(一)
转载请注明出处:http://blog.csdn.net/droyon/article/details/10194591 源码版本来自:Android4.0.3 忙了两三个月,终于有时间可以写点东西了 ...
- 彩信发送和接收关键流程
MMS 的设计基于WAP协议: DataConnection 手机上网数据连接,其中5种常用类型的APN配置信息中就有MMS类型,即收发彩信时需要建立手机上网数据连接: MMS发送和接收,就是Tran ...
- Android短信发送流程之多收件人发送(原)
前面的< Android短信发送流程之长短信发送 >中介绍了长短信对于普通短信的区别,而对于多收件人的情况,在SmsMessageSender的queueMessage()方法中我们了解到 ...
- Android短信发送流程之普通短信发送(原)
我们先来看最简单的流程入手分析,即收件人只有一个,而且不是长短信的情况. 一.地址有效性检测 当点击发送按钮时,触发onClick事件: [java] view plaincopy @ComposeM ...
- Android短信彩信收发流程(应用层)
下图为ComposeMessageActivity中confirmSendMessageIfNeeded部分的信息发送流程.主要以接收者有效性的确认为主,然后转向sendMessage方法进行发送. ...
最新文章
- 测试人员在需求阶段应做哪些工作
- DataWorks搬站方案:Azkaban作业迁移至DataWorks
- 这么画c语言编程流程图,我想问一下这两个C语言的流程图像图中这么画吗?
- C# 数据库连接字符串集合
- Linux中对进程的管理
- 每天学一点flash(75) ToolTip 提示
- 检测到目标主机可能存在缓慢的http拒绝服务攻击_高防服务器能防住哪些攻击?“流量清洗”与它有什么关系?...
- java future 不足_java Future用法和意义一句话击破
- VirtualBox配置
- linux常用命令集(用户和组操作-共15个)
- idea集成svn问题
- 元宇宙价值链解读:元宇宙现实体系映射对未来的影响
- MAC配置thinkPHP的心路历程(课设vue-tpadmin商城)
- 怎么改变图片的尺寸?教你在线修改图片尺寸大小
- getlasterror 126
- rabbitmq高并发RPC调用,你Get到了吗?
- JavaScript 读写剪贴板之方式汇总
- 【JMeter】后置处理器之JSON提取器
- win10睡眠按啥键唤醒_win10关闭屏幕后无法唤醒怎么办?电脑黑屏只能重启的解决方法...
- 100 道 Linux 常见面试题,建议收藏!
热门文章
- 现在分词的完成与一般式区别
- 尚硅谷谷粒商城第十六天 支付、秒杀
- 那些年被HR虐过的面试题,你是怎么回答的
- Asix2搭建Spring-MVC的WebService
- wandb的pip安装、离线安装和基础总结
- SVN_一个开源的版本管理软件
- 【Mac】python调用ImageMagick
- 易优CMS:compare的基础用法
- 转载:德国人信奉的人生哲理
- 自组网中继台_解决方案 无人机无线中继组网_Mesh自组网,无线自组网电台,mesh自组网单兵,自组网设备,无人机图传电台,应急通信自组网基站,COFDM MESH芯片厂家...