视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Android原生模块Email分析
2025-09-28 02:08:01 责编:小OO
文档
                        Email总结文档

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

1.Welcome.java

根据AndroidManifest.xml可知该文件为程序入口文件:

加载该文件时,查询数据库账户列表信息。如果查询出没有账户信息,则跳转到设置账户界面:AccountSetupBasics。查询出一条账户信息,将该账户的id传到下一个activity(MessageList)中,显示message列表。查询出多条账户信息,跳转到AcountFolderList中显示账户列表信息和MailBox列表信息。

2.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类,异步加载账户信息,异步删除账户信息(LoadAccountsTask,DeleteAccountTask)

5.删除账户信息使用托管对话框的形式创建Dialog,showDialog触发对onCreateDialog()方法的调用,因为对话框只创建一次所以通过回调onPrepareDialog()方法来实现对话框内容得更改。

6.accountFolderListItem这个类的作用是创建一个虚拟的ListItem,这样可以创建虚拟的Button来处理item的单击事件,这里处理的是账户文件夹

7.输入“debug”后,跳转到debug界面

8.这个activity同时了Activity,实现了onClickListener。通过setListener(this)方法为控件绑定Listener。在方法onClick中,使用switch(Id)来判断点击的控件,设置其点击事件。

9.删除账户信息中使用store ,以及controllerResult 的使用不明白,待继续研究

3.messageList + messageListItem  邮件列表

邮件信息列表,该界面显示了特定账户邮件列表。

点击Item 可查看该邮件的具体信息,即进入MessageView界面。

每个Item都有相同的Menu。

点击左边的checkBox会弹出pannel中的Button,对选中的邮件进行响应处理。点击任何一个item都会进入下一个界面:messageView。

 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模式,从来不希望发生。

4.messageCompose  发件箱

发件箱:实现邮件的发送,添加附件,存草稿,放弃等行为

1.发送邮件的五种方式:

     1.使用给定的账户发送消息,如果该账户是-1则给默认的额账户发送消息

     2.给mailto中的uri的账户发送信  

     3.回复(回复全部)发送信息

4.转发

5.从草稿箱恢复邮件,再发送

2.onCreate初始化控件:

为具体控件设置Listener,为Mailto,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及其单击事件

5.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

6.MailboxList :显示邮件箱列表:草稿箱,垃圾箱,未读邮件

  

1. Oncreate  初始化控件

2.异步加载账户信息,用于显示标题

3.消息处理:未完成加载信息、加载信息出错

4.异步加载邮箱类别信息:

DB查询所有类别邮箱的信息,分类设置。

异步查询每个邮件箱的message数量

4.创建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

  

1.AccountSetupBasics.java:设置新账户界面,输入账户名和密码

如果是设置第二个账户,那么可设置该账户为默认发送邮件的账户。输入账户名后,若DB查询该账户时候已存在,存在弹出dialog提示

分为手动设置和自动设置,如果不是EasFolw模式,那么都是手动设置。

   如果该账户的域名已知,跳转到AccountSetupCheckSettings否者跳到AccountSetupAccountType

2.AccountSetupAccountType.java

  设置邮件的三种传输协议:pop3,Imap,exchange

3.AccountSetupIncoming.java:邮件接受服务器的设置

     。

1.初始化控件,创建spinner,对账户名和密码,服务器,端口等设置TextWatcher的验证

2.对重复设定用户名进行验证,重复设定弹出对话框提示。

3.点击”下一步“时,根据用户输入的字段,创建一个URI

IMAP模式:设置IMAP path prefix

4.AccountSetupOutgoing.java:发送邮件服务器

 这个类的实现和接受服务器界面 相同

5.AccountSetupOptions.java:账户选项设置

三功能选项:1.收件箱检查频率

2.是否默认从该账户发送邮件,

3.当有新邮件时通知我

点击“next“时:保存所有账户信息。

1.使用功能类AccountSettingsUtils的方法将账户信息保存到数据库中

保存账户信息时,涉及很多其他的类。未做深入研究

如 :ExchangeStore类中方法向AccountManager中添加账户

ExchangeUtils类中的启动服务

6.AccountSetupNames.java:邮箱配置成功后,设置信息

两功能选项:1.设置一个账户名,用于显示在标题栏中

2.设置一个发邮件时显示的名字

     点击“done“后,将设置信息保存到数据库中

     点击“返回”键,如果是“EASFlow”模式,那么返回到上一级,否则返回到MessageList界面

7.AccountSetupCheckSettings.java:接受发送邮件服务器设置检测 

   在设置完服务器跳跳转到下一个界面时,检测服务器的设置。

    Incoming,outGoing

8.SpinnerOption.java:下拉框功能类:定位spinner

此处是根据RUI的scheme定位SecurityType的spinner的位置

9.AccountSettingsUtils.java:功能类

  方法介绍commitSetting():利用Provider将新设置的用户保存到DB,

AccountSetupOptions类中使用该方法保存账户

          findProviderForDomain():查找该账户的域名,当输入账户名时,会检测该账户的域名

          

10.AccountSettings.java:使用首选项PreferenceActivity的方式来存储账户的相关设置

  

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

2.初始化PreferenceActivity的控件。

3.在“返回”前,保存对该账户的相关设置,存数据到DB中

11.AccountSetupExchange.java:邮箱设置exchange服务器

   未深入研究exchang模式

12.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提示错误。下载本文

显示全文
专题