android Email總結文檔


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


一. Welcome.java


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

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

二. acountFolderList + accountFolderListItem


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

郵件箱列表:四種郵件箱:聯合的收件箱,草稿箱,發件箱,標記星星箱。 如果郵件箱中郵件個數為0,那么不顯示該郵件箱類別。

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

兩個列表是同樣的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提示錯誤。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM