android 4.0版本手机接受多条短信分析
注意:android 4.0 framework发送order broadcast一直到app处理完后framewrok再通知modem发送ACK,这个时间段不能超过8s(根据相关协议规定) 也即SMS的app处理这条有序广播的时间不能超过8s, 如果超过8s则不会通知modem去回复ACK,网络没收到ACK认为终端没有收到该短信,所以会再发送一次,这就是收到重复短信原因。
此方法内获取一个wake lock 然后启动SmsReceiverService服务
MmsLog.d(MmsApp.TXN_TAG, "SmsReceiver: onReceiveWithPrivilege(). Slot Id = "
SmsReceiverService.java中
启动该服务后,会调用onStartCommand方法,该方法传来的Intent为Message的Obj发送一条Message
在handleMessage方法里面通过Intent判断后执行相应的操作,
如handleSmsSent,handleSmsReceived,handleBootCompleted,handleServiceStateChanged
接受到短信时执行handleSmsReceived方法
private void handleSmsReceived(Intent intent, int error) {
SmsMessage[] msgs = Intents.getMessagesFromIntent(intent);
该方法内通过Intents.getMessagesFromIntent(intent)方法从Intent里面取出Message[]
然后通过insertMessage(this, msgs)方法插入短信insertMessage里通过调用storeMessage方法
Uri messageUri = null;
try {
messageUri = insertMessage(this, intent, error, format);
} catch (IllegalArgumentException e) {
MmsLog.e(TAG, "Save message fail:" + e.getMessage(), e);
return;
}
再在storeMessage方法执行values.put(Inbox.BODY, sms.getDisplayMessageBody())方法就可以将
短信以ContentValues的形式插入数据库。
storeMessage方法如果插入成功将会返回插入短信的Uri,如果此Uri不为Null,说明已经插入数据库,于是
在SmsReceiverService.java 中 handleSmsReceived()中
执行MessagingNotification.updateNewMessageIndicator(this, true);
该方法则会根据短信的状态,发出提示音或震动,也可以根据设置notification
自此,一条新信息就成功接受了。
主要log分析掌握:
//表示接受到短信广播,来了一条短信,05-29 09:11:28.723844 20407 20407 D Mms/Txn : SmsReceiver: onReceiveWithPrivilege(). Slot Id = 0, Action = android.provider.Telephony.SMS_RECEIVED, result = -1
//短信内容05-29 09:11:29.820343 20407 20443 D Mms/Txn : handleSmsReceived messageUri: content://sms/35, address: +8615901809630, body: QWERTY
long curTime = System.currentTimeMillis();
Log.d(TAG, "CNMA elplased time: " + (curTime - rTime));
if ((curTime - rTime) / 1000 > 8) {
Log.d(TAG, "APP process too long");
} else {
// For a multi-part message, this only ACKs the last
// part.
// Previous parts were ACK'd as they were received.
acknowledgeLastIncomingSms(success, rc, null);
}
------------------------------------
FW发送有序广播的时间点是08:00:31
003314 01-01 08:00:31.587 655 1047 V ActivityManager: Broadcast: Intent { act=android.provider.Telephony.SMS_RECEIVED flg=0x10 (has extras) } ordered=true userid=0
018183 01-01 08:00:40.753 1193 1193 D ActivityThread: BDC-Calling onReceive: intent=Intent { act=android.provider.Telephony.SMS_RECEIVED flg=0x10 cmp=com.android.mms/.transaction.PrivilegedSmsReceiver (has extras) }, ordered=true, receiver=com.android.mms.transaction.PrivilegedSmsReceiver@413fda90
04460 01-01 08:00:40.766 1000 1000 D SMS : CNMA elplased time: 9185
04461 01-01 08:00:40.766 1000 1000 D SMS : APP process too long
--------------------------------------
(1)刚开机就去接收短信,容易发生超时现象,导致接收到重复短信。
有可能客户定制了一些广播放在开机阶段去处理,如果是这种情况,需要去掉这些广播再测试看看。
( 如果这些广播都是系统的,都是必须要处理的,目前这种情况没有优化方案)
(2)有三方应用在拦截该广播。有可能客户定制了一些apk,这些apk也在接收SMS_RECEIVED的广播,且这些apk定的优先级比较高,
如果是这种case,可以在mainLog里搜一下act=android.provider.Telephony.SMS_RECEIVED分别被什么app给接收到,顺序是怎样的,
android 4.0版本手机接受多条短信分析相关推荐
- Python+Twilio写个exe,在电脑上向手机发送一条短信
写个exe,在电脑上向手机发送一条短信 用python写的界面 这里需要用到Twilio,下面给出学习路径 源程序 将程序打包成exe 示范一下: 有毒!现在twilio发送中文不行,发英文就没问题了 ...
- 华为谷歌android 6.0是什么,盘点那些用上Android 6.0的手机
目前市面上大多数智能手机运行的都是Android系统,这些年来Android系统也是在不断地升级中.终于在今年的9月30日,广大用户迎来了Android 6.0版本,这个代号为棉花糖的新系统在UI设计 ...
- 小米note android 5.0,预装Android 5.0版本MIUI6 小米Note顶配版首曝光
感谢JetaimeTech的投递 小米在1月15日正式发布了小米Note新机,同时还为发烧友定制推出了小米Note顶配版,搭载了强劲的骁龙810处理器.4GB RAM.2K显示屏等高端配置,如今从曝光 ...
- android 4.0的手机,酷派推出国内首款Android 4.0手机
文/DIY 在谷歌联手三星发布Android 4.0之后,小米科技相关负责人25日在媒体上表态,声称要在"国内第一个上4.0".对此,业界反应不一.援引北青网观点认为," ...
- android 4.0的手机,买了别后悔 不能官升Android 4.0手机
去年10月份谷歌发布了新一代移动智能平台--Android 4.0,全新的界面设计以及操控体验,受到了众多Android迷的喜爱.虽然理论上目前市面上所有采用Android 2.3的手机均可升级And ...
- 【Android 安全】DEX 加密 ( 不同 Android 版本的 DEX 加载 | Android 8.0 版本 DEX 加载分析 | Android 5.0 版本 DEX 加载分析 )
文章目录 一.不同版本的 DEX 加载 1.Android 8.0 版本 DEX 加载分析 2.Android 6.0 版本 DEX 加载分析 3.Android 5.0 版本 DEX 加载分析 一. ...
- flyme最新7基于android,终于来了,魅族开始基于Android 7.0版本的Flyme内测
拼 命 加 载 中 ... 在大部分厂商已经跟进基于Android 7.0的版本时,作为国内最著名的定制ROM之一的Flyme还停留在基于Android 6.0的版本,在系统更新速度上落后了很多.不过 ...
- android 10.0版本合入GMS包
gms包集成步骤: (1) 需要下载对应gms,国内需要通过VPN下载.下载后解压,文件目录:partner_gms.下载时,最好核对一下匹配的android版本. (2)依照路径打开gms.mk/g ...
- 小米note android 5.0,小米Note顶配版首曝光 预装Android 5.0版本MIUI6
小米在1月15日正式发布了小米Note新机,同时还为发烧友定制推出了小米Note顶配版,搭载了强劲的骁龙810处理器.4GB RAM.2K显示屏等高端配置,如今从曝光的图片显示,小米Note顶配版将直 ...
最新文章
- Android内存管理-OnTrimMemory
- CentOS系统提示用户名不在sudoers文件中
- Android应用插件式开发解决方法[转]
- 启动celery后执行任务报错:django.core.exceptions.ImproperlyConfigured
- 【Spring】使用Spring和AMQP发送接收消息(下)
- HashMap中hash(Object key)原理(hashcode >>> 16)
- VS Code Java 开发指南!
- 用计算机计算最大公因数,利用计算器求两个较大数的最大公约数的简便方法
- AFNetworking2.0源代码解析
- sersync+rsync多实例网站数据同步
- 中控考勤机重置考勤机密码方法
- 简单介绍一下用加速度传感器修正角速度传感器(陀螺仪)累计误差的原理
- 【线段树合并】【bzoj4399】: 魔法少女LJJ
- 怎么使用计算机公式,如何在电脑上输入运算公式?
- iOS签名校验那些事儿
- 双链路热备份(负载分担)实验
- Python爬虫之运用scrapy框架将爬取的内容存入文件和数据库
- seesion cookie鉴权 与 token鉴权
- mn数组计算java陆地和海洋01,2008年高三地理一轮复习精讲精练四—陆地和海洋
- Css实现漂亮的滚动条样式
热门文章
- 【故障检测问题】基于matlab免疫算法求解故障检测问题【含Matlab源码 196期】
- CleanMyMac XMac苹果电脑专属系统优化工具
- matlab留白,matlab作图导出为PDF去除留白插入latex
- 线上发版如何做到分批发的?详解蓝绿部署,滚动升级,A/B 测试,灰度发布/金丝雀发布
- 数学问题1 - 两个圆圈,小圆贴着大圆外部转过一圈,问小圆转几圈
- 【moment】moment生成日历图及日历事件展示
- C++学习心得和进阶路线总结
- ios下 KeyChain 的研究
- Kali Linux虚拟机——安装VPN客户端
- 前端从一只小白到工作半年的心路历程