欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android Mms之:聯(lián)系人管理的應(yīng)用分析

 更新時(shí)間:2013年05月22日 11:08:22   作者:  
本篇文章是對(duì)Android中的聯(lián)系人管理進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下

Contact聯(lián)系人對(duì)Mms來(lái)說(shuō)是十分重要的,因?yàn)槊恳粋€(gè)對(duì)話的收信人都是一個(gè)聯(lián)系人,新建信息時(shí)可以輸入聯(lián)系人的任何信息,比如號(hào)碼或名字,Mms都可以把信息發(fā)給相應(yīng)的人。Mms中的類Contact就是用來(lái)代表一個(gè)聯(lián)系人,它含有聯(lián)系人的信息,如名字,號(hào)碼,聯(lián)系人Id,是否存在于聯(lián)系人數(shù)據(jù)庫(kù)等等,同時(shí)Contact也提供了一些方法來(lái)獲取Contact對(duì)象,Contact.get()方法來(lái)獲取Contact對(duì)象。Contact會(huì)保持?jǐn)?shù)據(jù)與聯(lián)系人數(shù)據(jù)庫(kù)的同步,有一個(gè)接口updateContact()用于通知聯(lián)系人信息已經(jīng)發(fā)生了改變。

Contact內(nèi)部也有一個(gè)Cache,用于保存最近用到的聯(lián)系人。因?yàn)橥獠吭谟肅ontact.get()方法來(lái)獲取Contact時(shí)通常都只傳給一個(gè)號(hào)碼,并期望獲取Contact。

Contact內(nèi)部的Cache是由ContactCache類來(lái)創(chuàng)建和管理的。它內(nèi)部還有一個(gè)TaskStack用于管理一些Runnable。因?yàn)槊總€(gè)從數(shù)據(jù)庫(kù)中加載Contact都是一個(gè)單獨(dú)的線程,這個(gè)TaskStack就是專門用于管理Runnable和,以Stack的方式來(lái)管理,也即FILO順序的方式來(lái)運(yùn)行Runnable任務(wù)。

ContactCache中有很多重載的get()方法用于獲取Contact對(duì)象,其中都有一個(gè)布爾參數(shù)canBlock,這個(gè)是說(shuō)是以阻塞調(diào)用者的方式來(lái)加載Contact還是以異步的方式來(lái)加載,另外一個(gè)參數(shù)就是聯(lián)系人的號(hào)碼。get()方法會(huì)先調(diào)用internalGet()方法,internalGet()會(huì)先試圖從內(nèi)部的CachemContactHash中獲取Contact,如果不存在就用傳入的號(hào)碼新建一個(gè)Contact,總之它一定會(huì)返回一個(gè)聯(lián)系人的。之后會(huì)進(jìn)行updateContact()的動(dòng)作,updateContact()就是放在一個(gè)Runnable線程中,如果調(diào)用者是可阻塞的,馬上就運(yùn)行這個(gè)Runnable來(lái)updateContact,如果是異步方式就把這個(gè)Runnable放到TaskStack中稍后運(yùn)行。UpdateContact會(huì)調(diào)用getContactInfo來(lái)獲取聯(lián)系人的信息,getContactInfo會(huì)調(diào)用getContactInfoForSelf(),getContactInfoForPhoneNumber,getContactInfoForEmailAddress()來(lái)獲取具體的聯(lián)系人信息。其中如果這個(gè)號(hào)碼是手機(jī)聯(lián)系人自己本身,就獲取本機(jī)的相關(guān)信息;如果號(hào)碼是一個(gè)Email地址或者一個(gè)短號(hào)碼,或者字符號(hào)碼,那么就把號(hào)碼作為一個(gè)Email地址來(lái)查詢,也就是說(shuō)把它作為聯(lián)系人的Email字段匹配來(lái)查詢;其他情況,也就是號(hào)碼就是一個(gè)電話號(hào)碼,把它與聯(lián)系人的電話號(hào)碼字段匹配查詢。updateContact在查詢完成后,會(huì)調(diào)用接口UpdateListener.onUpdate(),以告訴監(jiān)聽(tīng)者,聯(lián)系人已更新。因?yàn)槁?lián)系人的獲取過(guò)程中都是異步的,所以才會(huì)在更新完成后調(diào)用接口來(lái)通知。

內(nèi)部的Cache的數(shù)據(jù)結(jié)構(gòu)是一個(gè)HashMap<String,ArrayList<Contact>>,Key是以Contact內(nèi)部的數(shù)據(jù)來(lái)生成的。InvalidateCache時(shí)并不會(huì)移除mContactsHash內(nèi)部的數(shù)據(jù),而是把其標(biāo)識(shí)為Stale,當(dāng)下次Get這個(gè)Contact時(shí)就會(huì)調(diào)用updateContact()來(lái)更新這個(gè)Contact。

相關(guān)文章

最新評(píng)論