Android源码分析(三):Mms模块总结(一)
简单介绍Android短信模块,其中每个公司在这部分都应该做了修改,因此与原生不完全一样。进入Mms应用开机会初始化一次,之后进入会检测更新,手动强行停止再启动同样会初始化(强行停止你可以再设置->应用程序->找到信息点击进行强行停止或者在eclipse中DDMS中的Devices中右上方有一排Debug、屏幕截图、和停止等功能中,选中进行进行停止,手机要连接成USB调试模式)这里就不上图了。
程序入口
1.初始化界面
Mms应用初始化(开机启动或者手动在设置->应用程序中强行停止后启动)时会在TabActivity.java中的onCreate()方法中使用ActionBar(Android活动栏)来创建Tab menu。
默认是3个,其中setupRecommodTab()通过ro.gn.mms.inline.support来控制。(其实程序入口类为com.android.mms.ui.BootActivity,可在AndroidManifest.xml中查看,然后通过intent跳转到TabActivity.java)通过private final TabListener mTabListener = new TabListener()来监听3个Tab menu之间的切换。
方法 |
类 |
功能 |
setupConvTab () |
ConvFragment.java |
信息列表 |
setupFavoritesTab() |
FavoritesFragment.java |
收藏夹 |
setupDraftTab() |
DraftFragment.java |
草稿箱 |
setupRecommodTab() |
RecommendFragment.java |
在线短信 |
按设置键会弹出option菜单:
通过TabActivity.java中的onCreateOptionsMenu()中的
getMenuInflater().inflate(R.menu.conversation_list_menu, menu)来设置这里的option菜单,
所有option中的菜单全部在conversation_list_menu.xml中,Tab 菜单不同对应的option菜单也不一样(与原生的不一样,经过改变了)。
在ConvFragment.java、FavoritesFragment.java、DraftFragment.java也会分别通过onCreate()和onCreateView()初始化默认值、控件和布局等。
2.初始化数据
在Mms模块启动时,要进行数据库的初始化,才能显示出各个菜单下面的短信列表以及短信对话框中的短信。
通过Contact.java中的gninit(Context context)方法来实现。
public void gninit(Context context) {
if (mQueryHandler == null) {
mQueryHandler = new QueryHandler(context);
}
initContactInfoMap();//开始对数据库的查询
}
根据发送短信的号码来查询,查询结果集(Cursor)的处理过程在onQueryComplete()中实现。初始化时,短信这边的内容都是空的,所以会把电话簿中对应数据库的数据全部加载进来。
onQueryComplete(){
……
if (gnContactInfoMap.get(number) == null) {//初始化,把所有联系人信息放入一个Map集合中
gnContactInfoMap.put(number, entry);
} else {
gnupdateContact(number, gnContactInfoMap.get(number), entry);
//更新
}
……
}
3.更新数据
可以在电话簿里或通过长按短信列表进入联系人编辑界面修改联系人资料。
此时,在Contact.java里面会通过DbChangeResolver这个类监听数据库的变化,如果数据库发生变化,也会调用initContactInfoMap()。(这里监听数据库变化主要是因为如果用户修改联系人信息,那么短信界面也要显示更改后的信息,并且要重新查询数据库中的联系人信息)。
class DbChangeResolver extends ContentObserver {
public DbChangeResolver(Handler handler) {
super(handler);
}
public void onChange(boolean selfChange) {
super.onChange(selfChange);
if (mQueryHandler != null) {
mQueryHandler.removeCallbacks(mQueryRunnable);
mQueryHandler.postDelayed(mQueryRunnable, 300);
}
}
}
private Runnable mQueryRunnable = new Runnable() {
public void run() {
isContactMapInited = false;
initContactInfoMap();
}
};
同样也会进入onQueryComplete()方法里面遍历查询,但是会进入前面代码中的else部分。
Tab菜单
1.信息
1. 显示全部的信息列表或是加密信息列表
初始化时,在ConvFragment.java(这里不是android原生的代码啦,是内部自己根绝需求而写的)的onCreateView() 和onViewCreated()中会分别声明Spinner控件和注册Spinner对应的监听,点击下列列表会弹出全部和加密2中选择。
OnItemSelectedListener spinnerListener = new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View v, int position, long row) {
if(position == 0){
……..
}else(position == 1){
……..
}
}
}
2.单击短信列表进入短信对话框
单击列表会调用ConvFragment.java中的onListItemClick()方法--onListItemClick(ListView l, View v, int position, long id).根据position来判断哪一个列表响应单击事件。
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
if(null != mActionModeHandler && mActionModeHandler.inSelectionMode()) {
mActionModeHandler.getSelectionManger().toggle(id);
} else {
Cursor cursor = (Cursor) getListView().getItemAtPosition(position);
if (cursor == null) {
return;
}
Conversation conv = Conversation.from(getActivity(), cursor);
long tid = conv.getThreadId();
openThread(tid, conv.getType());
}
}
这里通过下标位置查询所该有联系人的信息记录,通过openThread(tid, conv.getType());跳转到ComposeMessageActivity进行短信显示
private void openThread(long threadId, int type) {
if(FeatureOption.MTK_WAPPUSH_SUPPORT == true){
//wappush: add opptunities for starting wappush activity if it is a wappush thread
//type: Threads.COMMON_THREAD, Threads.BROADCAST_THREAD and Threads.WAP_PUSH
if(type == Threads.WAPPUSH_THREAD){
startActivity(WPMessageActivity.createIntent(getActivity(), threadId));
} else if (type == Threads.CELL_BROADCAST_THREAD) {
startActivity(CBMessageListActivity.createIntent(getActivity(), threadId));
} else {
startActivity(ComposeMessageActivity.createIntent(getActivity(), threadId));
}
}else{
if (type == Threads.CELL_BROADCAST_THREAD) {
startActivity(CBMessageListActivity.createIntent(getActivity(), threadId));
} else {
startActivity(ComposeMessageActivity.createIntent(getActivity(), threadId));
}
}
}
而上图界面实际上已经进入了ComposeMessageActivity这个activity中,此界面显示该号码的所有发送和接收的短信,在最后一条信息会显示该联系人的大头贴,可在此界面的执行:1.编辑短信
2.拨打电话
3.按option键可对此对话框进行加密
4.长按单条信息会弹出对该条信息的5个操作:删除、收藏、复制、转发,短息详情等,
同时可多选其他短信,长按前面4个操作(删除、收藏、复制、转发)会有提示语。
在ComposeMessageActivity类里会对单条信息的长按事件进行注册:
onCreate()àinitialize()à
initMessageList(){
mMsgListView.setOnItemLongClickListener();
}
同时会有注册onCreate()àinitResourceRefs()àgnInitResourceRefs()à
mCallButton(拨号)—单击
mMenuMoreButton(短信详情等)—单击
mDeleteImageButton(删除)—单击和长按
mStarImageButton(收藏) —单击和长按
mCopyImageButton(复制) —单击和长按
mForwardImageButton(转发) —单击和长按
3 长按信息列表会弹出带checkbox的信息列表
长按信息列表会调用ConvFragment.java中的onItemLongClick()方法:
onItemLongClick(){
initActionModeHandler();
}
在initActionModeHandler()中会初始化GnActionModeHandler这个类,在这个类中处理在这个listadapter中加入checkbox,对删除和加密、解锁事件进行注册。
2.收藏
收藏夹里面包括常用短语和短信收藏
初始化时,
onViewCreated(){
mAdapter = new MyExpandableListAdapter(getActivity());
mListView.setOnChildClickListener(this);
initData();
}
这里new一个MyExpandableListAdapter类来对这2列以及它们的子列进行操作,MyExpandableListAdapter继承BaseExpandableListAdapter这个类—实现可折叠的列表。而initData()方法是先后初始化这2列中要显示的数据内容:
private void initData() {
queryQuickText();//常用短语
queryFavoriteListChildData();//短信收藏
}
这2个方法都有对数据库的查询操作:
query(MmsSms.CONTENT_URI_QUICKTEXT,,QUICK_TEXT_PROJECTION, null, null, "_id desc");
query(Sms.CONTENT_URI, FAVORITE_PROJECTION, "star=1",null, null);
未完继续。。。。。。。。。。。。。。。。。。。。
转载于:https://blog.51cto.com/2402766/1103371
Android源码分析(三):Mms模块总结(一)相关推荐
- Android源码分析(三)-----系统框架设计思想
一 : 术在内而道在外 Android系统的精髓在源码之外,而不在源码之内,代码只是一种实现人类思想的工具,仅此而已...... 近来发现很多关于Android文章都是以源码的方向入手分析Androi ...
- Android源码分析-PackageManagerService(PMS)源码分析(三)- queryIntentActivities函数来查找activity
queryIntentActivities函数的作用: 在Android应用程序开发中,用startActivity可以开启另外一个Activity或应用.startActivity函数必须包含Int ...
- Android 源码分析
查看源码版本号: build\core\version_defaults.mk //搜索该文件中的 PLATFORM_VERSION值 frameworks 目录 (核心框架--java及C++语言) ...
- elasticsearch源码分析之search模块(server端)
elasticsearch源码分析之search模块(server端) 继续接着上一篇的来说啊,当client端将search的请求发送到某一个node之后,剩下的事情就是server端来处理了,具体 ...
- Android源码分析(十一)-----Android源码中如何引用aar文件
一:aar文件如何引用 系统Settings中引用bidehelper-1.1.12.aar 文件为例 源码地址:packages/apps/Settings/Android.mk LOCAL_PAT ...
- Nouveau源码分析(三):NVIDIA设备初始化之nouveau_drm_probe
Nouveau源码分析(三) 向DRM注册了Nouveau驱动之后,内核中的PCI模块就会扫描所有没有对应驱动的设备,然后和nouveau_drm_pci_table对照. 对于匹配的设备,PCI模块 ...
- 【投屏】Scrcpy源码分析三(Client篇-投屏阶段)
Scrcpy源码分析系列 [投屏]Scrcpy源码分析一(编译篇) [投屏]Scrcpy源码分析二(Client篇-连接阶段) [投屏]Scrcpy源码分析三(Client篇-投屏阶段) [投屏]Sc ...
- Android源码分析工具及方法
转载自:http://bbs.pediy.com/showthread.php?t=183278 标 题: [原创]Android源码分析工具及方法 作 者: MindMac 时 间: 2014-01 ...
- Android 源码分析工具
2019独角兽企业重金招聘Python工程师标准>>> 标 题: [原创]Android源码分析工具及方法 作 者: MindMac 时 间: 2014-01-02,09:32:35 ...
- Android源码分析 - Framework层的Binder(客户端篇)
开篇 本篇以aosp分支android-11.0.0_r25作为基础解析 我们在之前的文章中,从驱动层面分析了Binder是怎样工作的,但Binder驱动只涉及传输部分,待传输对象是怎么产生的呢,这就 ...
最新文章
- Win:Win系统下安装Linux的Ubuntu系统的简介、安装之详细攻略
- NIO和BIO如何影响应用程序的设计-设置处理线程数
- 南充一中计算机机房被盗,四川省CCF CSP-JS第一轮认证考试在南充一中成功举行...
- cocos2D中实现滑动菜单CCScrollView+CCMenu效果,(注意不是cocos2D-x)!!
- 51nod 1428 活动安排问题 (贪心+优先队列)
- 四川大学计算机学院优秀毕业论文,(完整版)四川大学本科_毕业论文(设计)_有关规定...
- 计算机毕设 SpringBoot+Vue车辆租赁管理系统 网上汽车租赁系统 汽车租赁管理系统 汽车分时租赁系统Java Vue MySQL数据库 远程调试 代码讲解
- 使用js完成一个类似于小广告的功能,斜着运动,遇到边界弹回
- 解决jellyfin媒体库标题乱码
- Latex 插入的图片紧跟当前文字
- Centos6.8系统镜像下载
- H5微信授权登录后点击返回出现循环登录无法退出问题
- 那些免费低价云主机真的可以永久使用吗?别再被套路了 盐谷君 上海盐谷 今天
- python 梦幻西游_tensorflow实践:梦幻西游人物弹窗识别(二)
- 你的跳槽涨薪幅度是多少?
- 区块链职业技术技能标准明确了人才培养的框架
- 电商收付通可视化进件二级商户,多功能升级
- windows10 PHP+Apache安装配置教程
- lucene 的使用详情
- 2016年北京中国云计算技术大会会后感
热门文章
- JVM启动的时候,默认加入的属性
- automation服务器不能创建对象”的问题的解决方案总结大全
- python将第一列替换_python-通过将另一列与第二个DataFrame进行比较来替换一列中的值...
- 怎么将算法改成程序_多肉烂根怎么办?将土培改成水培,长势好,叶子变得更水灵...
- adpcm 解码音量小_Oriolus 1795解码耳放评测:仅仅蓝牙还不够,我要的是“真无线”...
- 设计模式复习-享元模式
- 【组合数学】递推方程 ( 递推方程示例 1 | 列出递推方程 )
- 【Android 应用开发】Android 组件 位置坐标 属性 ( 组件位置属性 | 父容器坐标系坐标 | 窗口坐标系坐标 | 屏幕坐标系坐标 | 触摸坐标 )
- 设置 myeclipse 编码格式
- 架构师必看 京东咚咚架构演进