简单介绍Android短信模块,其中每一个公司在这部分都应该作了修改,所以与原生不彻底同样。进入Mms应用开机会初始化一次,以后进入会检测更新,手动强行中止再启动一样会初始化(强行中止你能够再设置->应用程序->找到信息点击进行强行中止或者在eclipse中DDMS中的Devices中右上方有一排Debug、屏幕截图、和中止等功能中,选中进行进行中止,手机要链接成USB调试模式)这里就不上图了。java
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菜单,
在ConvFragment.java、FavoritesFragment.java、DraftFragment.java也会分别经过onCreate()和onCreateView()初始化默认值、控件和布局等。
在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);
//更新
}
……
}
能够在电话簿里或经过长按短信列表进入联系人编辑界面修改联系人资料。
此时,在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部分。
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,对删除和加密、解锁事件进行注册。
收藏夹里面包括经常使用短语和短信收藏
初始化时,
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);
未完继续。。。。。。。。。。。。。。。。。。。。