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提示错误。
android Email总结文档的更多相关文章
- ShiWangMeSDK Android版接口文档 0.2.0 版
# ShiWangMeSDK Android版接口文档 0.2.0 版 android 总共有 14 个接口,分别涉及到初始化和对界面的一些细节的控制.下面详细介绍接口,如果没有特殊说明,接口都在 S ...
- [转载]Android SDK 离线文档 (api 20)(升级至api 23)
原文地址:SDK 离线文档 (api 20)(升级至api 23)">Android SDK 离线文档 (api 20)(升级至api 23)作者:leechenhwa Android ...
- android doc 本地文档加载慢的解决办法
从来都是FQ上谷歌官网查文档,但是有时没办法FQ,就得用sdk本地的doc文档了,由于文档内部的一些javascript,font等也需要访问Google来加载,导致了打开本地网页也巨慢无比,甚至转了 ...
- Android解析Excel文档完整示例
MainActivity如下: package cc.testexcel; import java.io.File; import jxl.Cell; import jxl.CellType; imp ...
- Android开发阅读文档资源
Android Studio:工具:http://developer.android.com/intl/zh-cn/tools/studio/index.html培训教程:http://develop ...
- Android Studio帮助文档的安装及智能提示设置
初次使用Android Studio,发现其智能提示不能像Visual Studio一样显示系统方法等的详细用途描述.经查找资料,问题原因是未安装SDK Document. 解决办法如下: 1.打开如 ...
- Android Studio API 文档_下载与使用
如何下载API 说明: 时间: 2016/7/9 根据百度经验步骤改编(百度经验), 但是比它更好, 亲测可用 1.1 下载API文档: 1.1.1 SDK Manager 1.1.2 1.1.3 ( ...
- Android之帮助文档
F:\Electronic_Design\software\Android\Android_SDK_windows\adt-bundle-windows-x86-20131030\sdk\docs\r ...
- Android 学习第7课,java android project 项目文档结构
src: 主要存放java源文件 gen:用于存放由开发工具自动生成的内容 R.java(很重要),用于登记各种资源的ID,编译器在你放入资源于自动生成的,程序员不需要自己去修改,是不能自己修改的 往 ...
随机推荐
- SSH框架的多表查询(方法二)
必须声明本文章==>http://www.cnblogs.com/zhu520/p/7773133.html 一:在前一个方法(http://www.cnblogs.com/zhu520/p ...
- SYSU 6356 Dispatching
Dispatching Time Limit: 3000ms Memory Limit: 262144KB This problem will be judged on SYSU. Original ...
- centos下安装redis/mysql等基础环境
1.修改语言 阿里云的ECS默认语言是:en_US.UTF-8,需要改成zh_CN.UTF-8 修改方法:vim /etc/locale.conf,然后重启. 查看方法:echo $LANG 2.安装 ...
- jquery autocomplete文本自己主动补全
文本自己主动补全功能确实非常有用. 先看下简单的效果:(样式不咋会写) 以下介绍几种: 1:jqery-actocomplete.js 这个网上有个写好的实例,上面挺具体的,能够下来执行下就清楚了就不 ...
- C++语言笔记系列之十三——派生类构造函数的调用
1.派生类构造函数的调用 (1)一个基类的全部数据成员均被派生类继承.创建一个派生类对象时.系统在为派生类对象分配单元时一定要为其基类数据成员分配子空间. (2)一个派生类对象在创建时不仅要调用派生类 ...
- js01----json,数组
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- android 图片特效处理之 图片叠加
这篇将讲到图片特效处理的图片叠加效果.跟前面一样是对像素点进行处理,可参照前面的android图像处理系列之七--图片涂鸦,水印-图片叠加和android图像处理系列之六--给图片添加边框(下)-图片 ...
- golang binarySearch
func binarySearch(nodes []*node, word Text) (int, bool) { start := end := len(nodes) - // 特例: { // 当 ...
- vue 中表单 [v-bind:true-value="a" v-bind:false-value="b"] 的用法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 2017国家集训队作业[agc014d]Black and White Tree
2017国家集训队作业[agc014d]Black and White Tree 题意: 有一颗n个点的树,刚开始每个点都没有颜色.Alice和Bob会轮流对这棵树的一个点涂色,Alice涂白,B ...