android Email總結文檔

目錄:src\com.android.email.activity


一. Welcome.java


根據AndroidManifest.xml可知該文件爲程序入口文件:

加載該文件時,查詢數據庫帳戶列表信息。若是查詢出沒有帳戶信息,則跳轉到設置帳戶界面:AccountSetupBasics。查詢出一條帳戶信息,將該帳戶的id傳到下一個activity(MessageList)中,顯示message列表。查詢出多條帳戶信息,跳轉到AcountFolderList中顯示帳戶列表信息和MailBox列表信息。

二. acountFolderList + accountFolderListItem


這兩個類一同構成一個帳戶郵件箱列表的界面。該界面中,分爲郵件箱列表和帳戶列表。java

郵件箱列表:四種郵件箱:聯合的收件箱,草稿箱,發件箱,標記星星箱。 若是郵件箱中郵件個數爲0,那麼不顯示該郵件箱類別。android

帳戶信息列表:顯示數據庫中已配置的帳戶。web

兩個列表是一樣的Layout,可是針對兩個列表有兩個不一樣的Menu。數據庫

點擊任何一個Item跳轉到下一界面:MessageList。安全


郵箱信息列表和帳戶信息列表

1.首先該界面主要是一個listView,每一個item都有同樣的layout。填充Item:在使用CursorAdapter綁定cursor數據時,使用LayoutInflater爲全部的item建立一個view,而後在將該view傳到bindViewItem()方法中進行數據綁定。

2. Item在顯示上分爲兩種:mailBox和帳戶列表。根據類型顯示隱藏所需控件。

在LoadAccountsTask()異步加載方法中實現信息加載:

郵箱信息列表:從數據庫中查出該類別的mailbox是否有郵件。若沒有則沒有該類型的item。不一樣類別的cursor信息存放到MatrixCursor中。 
帳戶信息列表:查詢帳戶列表。

3. 兩個menu控件(充當三個menu用):

ContextMenu:根據點擊ItemPosition來判斷彈出menu的內容。

分爲郵箱信息和帳戶信息,點擊menu後執行事件處理方法

三個menu控件都有本身的layout佈局文件,使用activity類中的方法getMenuInflater()來填充不一樣menu的layout

4.在UI線程外,使用AsyncTask<Void, Void, Object[]>類,異步加載帳戶信息,異步刪除帳戶信息(LoadAccountsTask,DeleteAccountTask)

5.刪除帳戶信息使用託管對話框的形式建立Dialog,showDialog觸發對onCreateDialog()方法的調用,由於對話框只建立一次因此經過回調onPrepareDialog()方法來實現對話框內容得更改。

6.accountFolderListItem這個類的做用是建立一個虛擬的ListItem,這樣能夠建立虛擬的Button來處理item的單擊事件,這裏處理的是帳戶文件夾

7.輸入「debug」後,跳轉到debug界面

8.這個activity實現了onClickListener。經過setListener(this)方法爲控件綁定Listener。在方法onClick中,使用switch(Id)來判斷點擊的控件,設置其點擊事件。

9.刪除帳戶信息中使用store ,以及controllerResult 的使用不明白,待繼續研究。


三.messageList + messageListItem 郵件列表


郵件信息列表,該界面顯示了特定帳戶郵件列表。

點擊Item 可查看該郵件的具體信息,即進入MessageView界面。

每一個Item都有相同的Menu。

點擊左邊的checkBox會彈出pannel中的Button,對選中的郵件進行響應處理。


1.生命週期函數

2.contextMenu的實現和其單擊事件

contextMenu六種單擊事件:打開,刪除,forward,回覆,回覆所有,標記爲未讀。

3.更新郵箱列表:

1). 點擊checkBox,後在footer中顯示的refresh

2). 定時更新郵件箱(設置更新頻率)

4.optionMenu的實現和單擊事件,optionMenu五種點擊事件:refresh,compose,folder,account,accoutnSettting

5.Item多選時,button控件容器pannel的顯示隱藏,以及pannel中三個Button的單擊事件:標記未讀,刪除,添加星星標記

6.消息處理:進度條、中止異步task、鏈接錯誤橫幅(MessageListHandler)

7.異步處理 :加載Message,設置標題(Inbox、Draft、Send和帳戶名等)

8.使用adapter將數據綁定到listView

9. messageListItem類建立虛擬的ListItem,是對單擊checkBox和star進行位置捕捉

10.在這裏footerMode有四種模式:就是在郵件列表的結束的時候會顯示foot

LIST_FOOTER_MODE_REFRESH :查看聯合收件箱,未讀郵件,星星標記郵件 時會顯示該模式,點擊該footer會執行Refresh方法。

LIST_FOOTER_MODE_MORE:IMAP,POP模式,查看固定的帳戶的收件箱 

LIST_FOOTER_MODE_SEND:查看發件箱

LIST_FOOTER_MODE_NONE:查看草稿箱。EAS模式,歷來不但願發生。

四. messageCompose 發件箱

 

發件箱:實現郵件的發送,添加附件,存草稿,放棄等行爲

1. 發送郵件的五種方式:

1).使用給定的帳戶發送消息,若是該帳戶是-1則給默認的帳戶發送消息

2).給mail to中的uri的帳戶發送信

3).回覆(回覆所有)發送信息

4).轉發

5).從草稿箱恢復郵件,再發送

2.onCreate初始化控件:

爲具體控件設置Listener,爲Mail to,cc,bcc設置adapter,validator,Tokenizer(編譯器:Rfc822Tokenizer)

3.異步加載Messages(LoadMessageTask)

異步加載信息,須要加載及設置Accout信息,以及顯示原Message等

1).當回覆,回覆所有,轉發時,直接設置Message

2).若從草稿箱從新恢復compose,在異步方法中再異步加載原來帶有的附件

3).前臺處理:發送(發送後保存郵件)、保存郵件爲草稿、放棄

4).使用InputFilter來驗證address,發送合法地址信息

5).從contentProvider的共享數據中,添加附件,加載附件後設置添加附件後的界面。也對刪除附件進行處理。

6).回覆,轉發時加入Quoted Text(即郵件的原信息界面)

7).初始化MailTo(加載Intent的時候):initFromIntent()

從Intent中解析出mailto,cc,bcc,主題,正文(body)

8).設置額外的格式信息:如回覆時,主題前要加Re,轉發主題加Fwd

9).設置OptionMenu及其單擊事件


五.MessageView:顯示郵件信息


1.handler處理消息:郵件帶附件,點擊open的一系列消息處理Progress,finish_load_attachment,enable,error等

1. onCreate方法:控件的初始化,爲控件綁定監聽器等

1.單擊發件地址,將會添加該聯繫人(若是已存在則跳轉都QuickContact

界面):跳轉到Contact界面。該界面是android自帶的應用程序,會將發件人做爲聯繫人添加到聯繫人中。這裏要設置Uri和action

2.設置右邊favorite星星,foot中的回覆,所有恢復,刪除的監聽器

3.點擊標題導航ImageButton,跳轉到上下郵件

4.監控郵件列表是否有變化,實現ContentObserver()。

共有四個layout:

1.message_view:

主界面,上面兩個跳轉ImageButton,

中套message_view_header

下面三個replay,replay all,delete按鈕。

2.message_view_header:主題時間日期,以及body,webView

3.message_view_invitation :會議邀請???

4.message_view_attachment:附件

2. 從Intent中初始化:獲得MessageId、MailboxId、是否能夠回覆和轉發

3. activity生命週期函數回調Controller方法

在destroy中,關閉全部正在執行的Task(cancelAllTasks)

4. 建立optionMenu及其單擊事件。

5. 異步加載Message,加載MessageBody

6. 異步加載附件:從附件中複製數據到UI中

7. 異步加載MessageList,查找後退前進的郵件Id,查找到Id後,若是點擊了前進或者後退,那麼會異步加載Message,以及Message的Body


六.MailboxList :顯示郵件箱列表:草稿箱,垃圾箱,未讀郵件


1.Oncreate 初始化控件

2.異步加載帳戶信息,用於顯示標題

3.消息處理:未完成加載信息、加載信息出錯

4.異步加載郵箱類別信息:

DB查詢全部類別郵箱的信息,分類設置。

異步查詢每一個郵件箱的message數量

5. 建立adapter,使用Inflater將數據綁定到View上


7. 敲入「Debug」

1.容許敏感信息調試登陸 (肯能將密碼顯示在日誌上)

2.容許交換分析器登陸(特別冗長)

3.容許交換sd卡登陸

8.如下功能類不懂,也未找到關聯類:

AccountShortcutPicker.java與Email.java類關聯,未做研究

AddressTextView.java

ProgressListener.java

UpgradeAccounts.java

上面的基本功能類中,使用了許多外部類:觀察import

經常使用的如controller,Email,Utility,EmailContent,Address都未對他們作深刻研究



目錄:src\com.android.email.activity.setup


一.AccountSetupBasics.java:設置新帳戶界面,輸入帳戶名和密碼


若是是設置第二個帳戶,那麼可設置該帳戶爲默認發送郵件的帳戶。輸入帳戶名後,若DB查詢該帳戶時候已存在,存在彈出dialog提示,

分爲手動設置和自動設置,若是不是EasFolw模式,那麼都是手動設置。 若是該帳戶的域名已知,跳轉到AccountSetupCheckSettings否者跳到AccountSetupAccountType

二.AccountSetupAccountType.java


設置郵件的三種傳輸協議:pop3,Imap,exchange

三.AccountSetupIncoming.java:郵件接受服務器的設置


1. 初始化控件,建立spinner,對帳戶名和密碼,服務器,端口等設置TextWatcher的驗證

2. 對重複設定用戶名進行驗證,重複設定彈出對話框提示。

3. 點擊」下一步「時,根據用戶輸入的字段,建立一個URI

IMAP模式:設置IMAP path prefix

四.AccountSetupOutgoing.java:發送郵件服務器


這個類的實現和接受服務器界面 相同

五.AccountSetupOptions.java:帳戶選項設置三功能選項


1.收件箱檢查頻率

2.是否默認從該帳戶發送郵件,

3.當有新郵件時通知我

點擊「next「時:保存全部帳戶信息。

1.使用功能類AccountSettingsUtils的方法將帳戶信息保存到數據庫中

保存帳戶信息時,涉及不少其餘的類。未作深刻研究

如 :ExchangeStore類中方法向AccountManager中添加帳戶

ExchangeUtils類中的啓動服務

六.AccountSetupNames.java:郵箱配置成功後,設置信息兩功能選項


1.設置一個帳戶名,用於顯示在標題欄中

2.設置一個發郵件時顯示的名字

點擊「done「後,將設置信息保存到數據庫中

點擊「返回」鍵,若是是「EASFlow」模式,那麼返回到上一級,不然返回到MessageList界面

七.AccountSetupCheckSettings.java:接受發送郵件服務器設置檢測


在設置完服務器跳跳轉到下一個界面時,檢測服務器的設置。

Incoming,outGoing

八.SpinnerOption.java:下拉框功能類

定位spinner服務器


此處是根據RUI的scheme定位SecurityType的spinner的位置

九.AccountSettingsUtils.java:功能類


方法介紹

commitSetting():利用Provider將新設置的用戶保存到DB,AccountSetupOptions類中使用該方法保存帳戶。

findProviderForDomain():查找該帳戶的域名,當輸入帳戶名時,會檢測該帳戶的域名。

十.AccountSettings.java:使用首選項PreferenceActivity的方式來存儲帳戶的相關設置


1.設置Preference的xml保存文件。

2.初始化PreferenceActivity的控件。

3.在「返回」前,保存對該帳戶的相關設置,存數據到DB中

十一.AccountSetupExchange.java:郵箱設置exchange服務器


未深刻研究exchang模式

十二.AccountSecurity.java:帳戶安全

1.在SetupName界面中,點擊下一步時會最後一次檢查email的安全問題 2.在MessageList的界面中,查找指定的郵件箱類別時,可能會加載該界面 在setup中總會遇到onActivityResult,本身總結onActivityResult: 前提:有AB兩個類,A類調用B類,當B類finish後返回給A類一個結果,A類根據返回的結果進行相應處理。 首先它是個回調函數,觸發回調事件是當該A activity所調用的B activity執行finish的時候,返回到該activity中執行該回調函數。 A中啓動B的方法;startActivityforResult(Intent data,int requstCode); B中設置返回結果:setResult(int resultCode,Intent data); A中執行onActivityResult(int request,int resultCode,Intent intent); 在onActivityResult的方法中通常會作的操做:若是沒有意外(Resultok),那麼跳轉到下一個界面,否者會「返回」上一界面。 也就是B界面至關於一個檢查界面,只有它經過了,那麼A才能向下執行,否者返回到B界面,而且彈出DIalog進行提示。 以Email模塊做爲參考:在setup中,setupCheckSetting就是一個檢查類,Incoming,outGoing,setName等不少activity執行完都會啓動setupCheckSetting,當setupCheckSetting處理完信息後,會返回給各個activity,若是ok則跳轉到下一個界面,不然,返回到setupCheckSetting界面,彈出dialog提示錯誤。
相關文章
相關標籤/搜索