Android源码分析(三):Mms模块总结(一)

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介:

    简单介绍Android短信模块,其中每个公司在这部分都应该做了修改,因此与原生不完全一样。进入Mms应用开机会初始化一次,之后进入会检测更新,手动强行停止再启动同样会初始化(强行停止你可以再设置->应用程序->找到信息点击进行强行停止或者在eclipseDDMS中的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()来监听3Tab 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.javaFavoritesFragment.javaDraftFragment.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(转发) —单击和长按

 

 

长按信息列表会弹出带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);

       未完继续。。。。。。。。。。。。。。。。。。。。










本文转自 646676684 51CTO博客,原文链接:http://blog.51cto.com/2402766/1103371,如需转载请自行联系原作者
目录
相关文章
|
29天前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
115 4
|
7月前
|
Android开发
Android MediaTek 平台增加UART接口的红外模块支持,支持NEC红外遥控
Android MediaTek 平台增加UART接口的红外模块支持,支持NEC红外遥控
143 0
|
4月前
|
编解码 网络协议 前端开发
如何实现Android平台GB28181设备接入模块按需打开摄像头并回传数据
后台采集摄像头,如果想再进一步扩展,可以把android平台gb28181的camera2 demo,都移植过来,实现功能更强大的国标设备侧,这里主要是展示,收到国标平台侧的回传请求后,才打开摄像头,才开始编码打包,最大限度的减少资源的占用
|
4月前
|
编解码 网络协议 Android开发
Android平台GB28181设备接入模块实现后台service按需回传摄像头数据到国标平台侧
我们在做Android平台GB28181设备对接模块的时候,遇到这样的技术需求,开发者希望能以后台服务的形式运行程序,国标平台侧没有视频回传请求的时候,仅保持信令链接,有发起视频回传请求或语音广播时,打开摄像头,并实时回传音视频数据或接收处理国标平台侧发过来的语音广播数据。
|
4月前
|
Java Android开发
添加Flutter模块到已有项目(Android)
添加Flutter模块到已有项目(Android)
52 3
|
4月前
|
监控 Java 开发工具
如何快速对接Android平台GB28181接入模块(SmartGBD)
大牛直播SDK推出的Android平台GB28181接入SDK(SmartGBD),可实现不具备国标音视频能力的 Android终端,通过平台注册接入到现有的GB/T28181—2016服务,可用于如执法记录仪、智能安全帽、智能监控、智慧零售、智慧教育、远程办公、明厨亮灶、智慧交通、智慧工地、雪亮工程、平安乡村、生产运输、车载终端等场景,可能是业内为数不多功能齐全性能优异的商业级水准GB28181接入SDK。
|
4月前
|
编解码 开发工具 Android开发
Android平台RTMP直播推送模块技术接入说明
大牛直播SDK跨平台RTMP直播推送模块,始于2015年,支持Windows、Linux(x64_64架构|aarch64)、Android、iOS平台,支持采集推送摄像头、屏幕、麦克风、扬声器、编码前、编码后数据对接,功能强大,性能优异,配合大牛直播SDK的SmartPlayer播放器,轻松实现毫秒级的延迟体验,满足大多数行业的使用场景。RTMP直播推送模块数据源,支持编码前、编码后数据对接
|
4月前
|
监控 开发工具 Android开发
结合GB/T28181规范探讨Android平台设备接入模块心跳实现
本文介绍了GB28181标准中的状态信息报送机制,即心跳机制,用于监控设备与服务器间的连接状态。根据国标GB/T28181-2016,设备在异常时需立即发送状态信息,在正常状态下则按固定间隔(默认60秒)定期发送。若连续三次(默认值)未收到心跳,则视为离线。文章展示了在Android平台的GB28181设备接入模块(SmartGBD)中,如何调整心跳间隔为20秒及超时次数为3次,并给出了心跳消息的示例和异常处理代码片段。对于希望深入了解或遇到问题的开发者,作者提供了进一步交流的机会。
|
4月前
|
编解码 API 开发工具
Android平台轻量级RTSP服务模块二次封装版调用说明
本文介绍了Android平台上轻量级RTSP服务模块的二次封装实践,旨在简化开发流程,让开发者能更专注于业务逻辑。通过`LibPublisherWrapper`类提供的API,可在应用中轻松初始化RTSP服务、配置视频参数(如分辨率、编码类型)、启动与停止RTSP服务及流发布,并获取RTSP会话数量。此外,还展示了如何处理音频和视频数据的采集与推送。最后,文章提供了从启动服务到销毁资源的完整示例,帮助开发者快速集成实时流媒体功能。
|
4月前
|
编解码 开发工具 Android开发
Android平台轻量级RTSP服务模块技术接入说明
为满足内网无纸化/电子教室等内网超低延迟需求,避免让用户配置单独的服务器,大牛直播SDK在推送端发布了轻量级RTSP服务SDK。 轻量级RTSP服务解决的核心痛点是避免用户或者开发者单独部署RTSP或者RTMP服务,实现本地的音视频数据(如摄像头、麦克风),编码后,汇聚到内置RTSP服务,对外提供可供拉流的RTSP URL,轻量级RTSP服务,适用于内网环境下,对并发要求不高的场景,支持H.264/H.265,支持RTSP鉴权、单播、组播模式,考虑到单个服务承载能力,我们支持同时创建多个RTSP服务,并支持获取当前RTSP服务会话连接数。