簡單介紹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);
未完繼續。。。。。。。。。。。。。。。。。。。。