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