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