目錄: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提示錯誤。