您的位置:首页 > 移动开发 > Android开发

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

2012-12-28 19:52 465 查看
简单介绍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);
未完继续。。。。。。。。。。。。。。。。。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息