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提示错误。
相关文章
相关标签/搜索