[转]Android App之Email浅析
Base on Android4.2.1
以下不保证正确性,仅供娱乐参考。
Email的概念层次图,可以对Email有个宏观的了解(pop端口一般是995,而smtp一般是465)。
代码部分,定位到java层次
packages/apps/Email/src/com/android/email
各个部分的代码作用区域大概就是这些了,有些时候其实看UML图比我说千百遍都来的很好理解
回归到最早期的email,是通过发送指令下达消息的,具体可以参考文章后面的链接,上文提到的transport文件夹是用来处理通信的,找到 smtpSender.java文件,里面有一段代码用来发送email data以及cc bc等,而其他的java只是做了些用户交互的东西。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
...
try{
executeSimpleCommand("MAIL FROM: "+"<"+from.getAddress()+">");
for(Address address:to){
executeSimpleCommand("RCPT TO: "+"<"+address.getAddress()+">");
}
for(Address address:cc){
executeSimpleCommand("RCPT TO: "+"<"+address.getAddress()+">");
}
for(Address address:bcc){
executeSimpleCommand("RCPT TO: "+"<"+address.getAddress()+">");
}
executeSimpleCommand("DATA");
...
|
接下来从总体架构看下email的消息走向先从setupxxx.java配置账户,在此注意xml的解偶作用,随后Controller把消息传 送到messagingController,注意这是一个死循环的Thread,内置一个Queue消息队列,接下来就是一些异步Task和监听的 Listener 回掉,总感觉还是看图方便,希望这个图能让大家看懂。
其中synchronizeMailboxGeneric中操作比较多,下面列一下,英文的,看不懂拉倒。
- Get the message list from the local store and create an index of the uids
- Open the remote folder and create the remote folder if necessary
- Open the remote folder. This pre-loads certain metadata like message count
- Trash any remote messages that are marked as trashed locally
- Get the remote message count
- Determine the limit # of messages to download
- Create a list of messages to download
- Download basic info about the new/unloaded messages (if any)
- Refresh the flags for any messages in the local store that we didn’t just download
- Remove any messages that are in the local store but no longer on the remote store
- Clean up and report results
在多个账户同时接收邮件的过程中常常遇到多个线程的交互,这样就必须用到锁机制,随便搜索了下,大多数是些读写操作,这也很符合PV操作的概念,凑合看下吧,可能以后会做详细解释。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
|
----synchronized Matches(231in56files)----
AccountServerBaseFragment.java(...\email\src\com\android\email\activity\setup): publicstaticsynchronized Bundle getSettingsModeArgs(LongaccountID){
AccountSetupOptions.java(...\email\src\com\android\email\activity\setup): synchronized(mCommitQueueLock){
AccountSetupOptions.java(...\email\src\com\android\email\activity\setup): synchronized(mCommitQueueLock){
AttachmentDownloadService.java(...\email\src\com\android\email\service): *synchronized on the map itself
AttachmentDownloadService.java(...\email\src\com\android\email\service): publicsynchronized voidonChange(Context context,Attachment att){
AttachmentDownloadService.java(...\email\src\com\android\email\service): /*package*/synchronized DownloadRequest findDownloadRequest(longid){
AttachmentDownloadService.java(...\email\src\com\android\email\service): publicsynchronized booleanisEmpty(){
AttachmentDownloadService.java(...\email\src\com\android\email\service): /*package*/synchronized voidprocessQueue(){
AttachmentDownloadService.java(...\email\src\com\android\email\service): /*package*/synchronized intdownloadsForAccount(longaccountId){
AttachmentDownloadService.java(...\email\src\com\android\email\service): /*package*/synchronized booleantryStartDownload(DownloadRequest req){
AttachmentDownloadService.java(...\email\src\com\android\email\service): privatesynchronized DownloadRequest getDownloadInProgress(longattachmentId){
AttachmentDownloadService.java(...\email\src\com\android\email\service): /*package*/synchronized voidendDownload(longattachmentId,intstatusCode){
AttachmentDownloadService.java(...\email\src\com\android\email\service): synchronized(mLock){
AttachmentDownloadService.java(...\email\src\com\android\email\service): privatesynchronized Intent getServiceIntentForAccount(longaccountId){
AttachmentDownloadService.java(...\email\src\com\android\email\service): synchronized(mLock){
AttachmentDownloadService.java(...\email\src\com\android\email\service): synchronized(mConnectivityManagerLock){
AttachmentDownloadService.java(...\email\src\com\android\email\service): synchronized(mConnectivityManagerLock){
AttachmentDownloadService.java(...\email\src\com\android\email\service): synchronized(mDownloadSet){
ByteArrayOutputStream.java(...\email\emailcommon\src\org\apache\commons\io\output): synchronized(this){
ByteArrayOutputStream.java(...\email\emailcommon\src\org\apache\commons\io\output): publicsynchronized voidwrite(intb){
ByteArrayOutputStream.java(...\email\emailcommon\src\org\apache\commons\io\output): publicsynchronized intwrite(InputStream in)throwsIOException{
ByteArrayOutputStream.java(...\email\emailcommon\src\org\apache\commons\io\output): publicsynchronized intsize(){
ByteArrayOutputStream.java(...\email\emailcommon\src\org\apache\commons\io\output): publicsynchronized voidreset(){
ByteArrayOutputStream.java(...\email\emailcommon\src\org\apache\commons\io\output): publicsynchronized voidwriteTo(OutputStream out)throwsIOException{
ByteArrayOutputStream.java(...\email\emailcommon\src\org\apache\commons\io\output): publicsynchronized byte[]toByteArray(){
CloseShieldInputStream.java(...\email\emailcommon\src\org\apache\james\mime4j): publicsynchronized voidreset()throwsIOException{
CloseShieldInputStream.java(...\email\emailcommon\src\org\apache\james\mime4j): publicsynchronized voidmark(intreadlimit){
ContentCache.java(...\email\src\com\android\email\provider):*Synchronization note:All of the publicmethods inContentCache are synchronized(i.e.on the
ContentCache.java(...\email\src\com\android\email\provider): *Asynchronized reference counter forarbitrary objects
ContentCache.java(...\email\src\com\android\email\provider): /*package*/synchronized intsubtract(Tobject){
ContentCache.java(...\email\src\com\android\email\provider): /*package*/synchronized voidadd(Tobject){
ContentCache.java(...\email\src\com\android\email\provider): /*package*/synchronized booleancontains(Tobject){
ContentCache.java(...\email\src\com\android\email\provider): /*package*/synchronized intgetCount(Tobject){
ContentCache.java(...\email\src\com\android\email\provider): synchronized intsize(){
ContentCache.java(...\email\src\com\android\email\provider): synchronized Set<HashMap.Entry<T,Integer>>entrySet(){
ContentCache.java(...\email\src\com\android\email\provider): synchronized(mCache){
ContentCache.java(...\email\src\com\android\email\provider): publicsynchronized CacheToken getCacheToken(Stringid){
ContentCache.java(...\email\src\com\android\email\provider): publicsynchronized Cursor putCursorImpl(Cursorc,Stringid,String[]projection,
ContentCache.java(...\email\src\com\android\email\provider): publicsynchronized Cursor getCachedCursor(Stringid,String[]projection){
ContentCache.java(...\email\src\com\android\email\provider): publicsynchronized voidlock(Stringid){
ContentCache.java(...\email\src\com\android\email\provider): publicsynchronized voidunlock(Stringid){
ContentCache.java(...\email\src\com\android\email\provider): publicsynchronized voidunlock(Stringid,ContentValues values){
ContentCache.java(...\email\src\com\android\email\provider): publicsynchronized voidinvalidate(){
ContentCache.java(...\email\src\com\android\email\provider): publicsynchronized voidinvalidate(Stringoperation,Uri uri,Stringselection){
ContentCache.java(...\email\src\com\android\email\provider): publicstaticsynchronized voidnotCacheable(Uri uri,Stringselection){
Controller.java(...\email\src\com\android\email): publicsynchronized staticController getInstance(Context _context){
Controller.java(...\email\src\com\android\email): publicsynchronized staticvoidinjectMockControllerForTest(Controller mockController){
Controller.java(...\email\src\com\android\email): synchronized(mListeners){
Controller.java(...\email\src\com\android\email): synchronized(mListeners){
Controller.java(...\email\src\com\android\email): // synchronized (mListeners) {
Controller.java(...\email\src\com\android\email): *Synchronized so multiple threads can call it(andnotrisk creating duplicate boxes).
Controller.java(...\email\src\com\android\email): publicsynchronized longfindOrCreateMailboxOfType(longaccountId,intmailboxType){
Controller.java(...\email\src\com\android\email): synchronized(mListeners){
Controller.java(...\email\src\com\android\email): synchronized(mListeners){
Controller.java(...\email\src\com\android\email): synchronized(mListeners){
Controller.java(...\email\src\com\android\email): synchronized(mListeners){
Controller.java(...\email\src\com\android\email): synchronized(mListeners){
Controller.java(...\email\src\com\android\email): synchronized(mListeners){
Controller.java(...\email\src\com\android\email): synchronized(mListeners){
Controller.java(...\email\src\com\android\email): synchronized(mListeners){
Controller.java(...\email\src\com\android\email): synchronized(mListeners){
Controller.java(...\email\src\com\android\email): synchronized(mListeners){
Controller.java(...\email\src\com\android\email): synchronized(mListeners){
Controller.java(...\email\src\com\android\email): synchronized(mListeners){
Controller.java(...\email\src\com\android\email): synchronized(mListeners){
Controller.java(...\email\src\com\android\email): synchronized(mListeners){
Controller.java(...\email\src\com\android\email): synchronized(mListeners){
Controller.java(...\email\src\com\android\email): synchronized(mListeners){
Controller.java(...\email\src\com\android\email): synchronized(mListeners){
Controller.java(...\email\src\com\android\email): synchronized publicvoidsendPendingMessagesStarted(longaccountId,longmessageId){
Controller.java(...\email\src\com\android\email): synchronized(mListeners){
Controller.java(...\email\src\com\android\email): synchronized publicvoidsendPendingMessagesCompleted(longaccountId){
Controller.java(...\email\src\com\android\email): synchronized(mListeners){
Controller.java(...\email\src\com\android\email): synchronized publicvoidsendPendingMessagesFailed(longaccountId,longmessageId,
Controller.java(...\email\src\com\android\email): synchronized(mListeners){
Controller.java(...\email\src\com\android\email): synchronized(mListeners){
Controller.java(...\email\src\com\android\email): synchronized(mListeners){
Controller.java(...\email\src\com\android\email): synchronized(mListeners){
Controller.java(...\email\src\com\android\email): synchronized(mListeners){
Controller.java(...\email\src\com\android\email): synchronized(mListeners){
Controller.java(...\email\src\com\android\email): privatesynchronized voidbroadcastCallback(ServiceCallbackWrapper wrapper){
CountingInputStream.java(...\email\emailcommon\src\org\apache\commons\io\input): publicsynchronized intgetCount(){
CountingInputStream.java(...\email\emailcommon\src\org\apache\commons\io\input): publicsynchronized intresetCount(){
CountingInputStream.java(...\email\emailcommon\src\org\apache\commons\io\input): publicsynchronized longgetByteCount(){
CountingInputStream.java(...\email\emailcommon\src\org\apache\commons\io\input): publicsynchronized longresetByteCount(){
CountingOutputStream.java(...\email\emailcommon\src\org\apache\commons\io\output): publicsynchronized intgetCount(){
CountingOutputStream.java(...\email\emailcommon\src\org\apache\commons\io\output): publicsynchronized intresetCount(){
CountingOutputStream.java(...\email\emailcommon\src\org\apache\commons\io\output): publicsynchronized longgetByteCount(){
CountingOutputStream.java(...\email\emailcommon\src\org\apache\commons\io\output): publicsynchronized longresetByteCount(){
Device.java(...\email\emailcommon\src\com\android\emailcommon): staticpublicsynchronized StringgetDeviceId(Context context)throwsIOException{
Email.java(...\email\src\com\android\email): publicstaticsynchronized voidsetNotifyUiAccountsChanged(booleansetFlag){
Email.java(...\email\src\com\android\email): publicstaticsynchronized booleangetNotifyUiAccountsChanged(){
EmailAsyncTask.java(...\email\emailcommon\src\com\android\emailcommon\utility): synchronized(mTasks){
EmailAsyncTask.java(...\email\emailcommon\src\com\android\emailcommon\utility): synchronized(mTasks){
EmailAsyncTask.java(...\email\emailcommon\src\com\android\emailcommon\utility): synchronized(mTasks){
EmailAsyncTask.java(...\email\emailcommon\src\com\android\emailcommon\utility): synchronized(mTasks){
EmailClientConnectionManager.java(...\email\emailcommon\src\com\android\emailcommon\utility): publicsynchronized voidregisterClientCert(
EmailClientConnectionManager.java(...\email\emailcommon\src\com\android\emailcommon\utility): publicsynchronized voidunregisterClientCert(
EmailClientConnectionManager.java(...\email\emailcommon\src\com\android\emailcommon\utility): publicsynchronized booleanhasDetectedUnsatisfiedCertReq(longsince){
EmailConnectivityManager.java(...\email\src\com\android\email): synchronized(mLock){
EmailConnectivityManager.java(...\email\src\com\android\email): synchronized(mLock){
EmailExternalUtils.java(...\email\emailcommon\src\com\android\emailcommon\service): synchronized(sUpdateCountMap){
EmailExternalUtils.java(...\email\emailcommon\src\com\android\emailcommon\service): synchronized(sUpdateCountMap){
EmailProvider.java(...\email\src\com\android\email\provider): synchronized SQLiteDatabase getDatabase(Context context){
EmailProvider.java(...\email\src\com\android\email\provider): synchronized(mMailboxTypeMap){
EmailProvider.java(...\email\src\com\android\email\provider): synchronized(mMailboxTypeMap){
EmailProvider.java(...\email\src\com\android\email\provider): synchronized(mMailboxTypeMap){
EmailProvider.java(...\email\src\com\android\email\provider): synchronized(mMailboxTypeMap){
EmailProvider.java(...\email\src\com\android\email\provider): synchronized(mMailboxTypeMap){
EmailWidget.java(...\email\src\com\android\email\widget): synchronized(this){
EmailWidget.java(...\email\src\com\android\email\widget): synchronized(this){
EmailWidget.java(...\email\src\com\android\email\widget): publicsynchronized RemoteViews getViewAt(intposition){
FileCleaner.java(...\email\emailcommon\src\org\apache\commons\io): publicstaticsynchronized voidexitWhenFinished(){
FileCleaningTracker.java(...\email\emailcommon\src\org\apache\commons\io): finalCollection<Tracker>/* Tracker */trackers=newVector<Tracker>(); // synchronized
FileCleaningTracker.java(...\email\emailcommon\src\org\apache\commons\io): privatesynchronized voidaddTracker(Stringpath,Objectmarker,FileDeleteStrategy deleteStrategy){
FileCleaningTracker.java(...\email\emailcommon\src\org\apache\commons\io): // synchronized block protects reaper
FileCleaningTracker.java(...\email\emailcommon\src\org\apache\commons\io): publicsynchronized voidexitWhenFinished(){
FileCleaningTracker.java(...\email\emailcommon\src\org\apache\commons\io): // synchronized block protects reaper
FileCleaningTracker.java(...\email\emailcommon\src\org\apache\commons\io): synchronized(reaper){
FolderProperties.java(...\email\src\com\android\email): publicstaticsynchronized FolderProperties getInstance(Context context){
FolderProperties.java(...\email\src\com\android\email): publicstaticsynchronized voidremoveInstance(){
GroupMessagingListener.java(...\email\src\com\android\email): Nevertheless,let'skeep the"synchronized"forawhileinthe case
GroupMessagingListener.java(...\email\src\com\android\email): synchronized publicvoidaddListener(MessagingListener listener){
GroupMessagingListener.java(...\email\src\com\android\email): synchronized publicvoidremoveListener(MessagingListener listener){
GroupMessagingListener.java(...\email\src\com\android\email): synchronized publicbooleanisActiveListener(MessagingListener listener){
GroupMessagingListener.java(...\email\src\com\android\email): synchronized publicvoidlistFoldersStarted(longaccountId){
GroupMessagingListener.java(...\email\src\com\android\email): synchronized publicvoidlistFoldersFailed(longaccountId,Stringmessage){
GroupMessagingListener.java(...\email\src\com\android\email): synchronized publicvoidlistFoldersFinished(longaccountId){
GroupMessagingListener.java(...\email\src\com\android\email): synchronized publicvoidsynchronizeMailboxStarted(longaccountId,longmailboxId){
GroupMessagingListener.java(...\email\src\com\android\email): synchronized publicvoidsynchronizeEnvelopeFinished(longaccountId,longmailboxId){
GroupMessagingListener.java(...\email\src\com\android\email): synchronized publicvoidsynchronizeMailboxFinished(longaccountId,longmailboxId,
GroupMessagingListener.java(...\email\src\com\android\email): synchronized publicvoidsynchronizeMailboxFailed(longaccountId,longmailboxId,Exceptione){
GroupMessagingListener.java(...\email\src\com\android\email): synchronized publicvoidloadMessageForViewStarted(longmessageId){
GroupMessagingListener.java(...\email\src\com\android\email): synchronized publicvoidloadMessageForViewFinished(longmessageId){
GroupMessagingListener.java(...\email\src\com\android\email): synchronized publicvoidloadMessageForViewFailed(longmessageId,Stringmessage){
GroupMessagingListener.java(...\email\src\com\android\email): synchronized publicvoidcheckMailStarted(Context context,longaccountId,longtag){
GroupMessagingListener.java(...\email\src\com\android\email): synchronized publicvoidcheckMailFinished(Context context,longaccountId,longfolderId,
GroupMessagingListener.java(...\email\src\com\android\email): synchronized publicvoidsendPendingMessagesStarted(longaccountId,longmessageId){
GroupMessagingListener.java(...\email\src\com\android\email): synchronized publicvoidsendPendingMessagesCompleted(longaccountId){
GroupMessagingListener.java(...\email\src\com\android\email): synchronized publicvoidsendPendingMessagesFailed(longaccountId,longmessageId,
GroupMessagingListener.java(...\email\src\com\android\email): synchronized publicvoidmessageUidChanged(longaccountId,longmailboxId,
GroupMessagingListener.java(...\email\src\com\android\email): synchronized publicvoidloadAttachmentStarted(
GroupMessagingListener.java(...\email\src\com\android\email): synchronized publicvoidloadAttachmentFinished(
GroupMessagingListener.java(...\email\src\com\android\email): synchronized publicvoidloadAttachmentFailed(
GroupMessagingListener.java(...\email\src\com\android\email): synchronized publicvoidcontrollerCommandCompleted(booleanmoreCommandsToRun){
ImapFolder.java(...\email\src\com\android\email\mail\store): synchronized(this){
ImapFolder.java(...\email\src\com\android\email\mail\store): synchronized(this){
ImapFolder.java(...\email\src\com\android\email\mail\store): synchronized(this){
ImapFolder.java(...\email\src\com\android\email\mail\store): synchronized(this){
ImapResponseParser.java(...\email\src\com\android\email\mail\store\imap): synchronized(MailService.sSynchronizeLock){
ImapStore.java(...\email\src\com\android\email\mail\store): synchronized(ImapStore.class){
LegacyConversions.java(...\email\src\com\android\email): publicstaticsynchronized intinferMailboxTypeFromName(Context context,StringmailboxName){
LockableFileWriter.java(...\email\emailcommon\src\org\apache\commons\io\output): synchronized(LockableFileWriter.class){
MailService.java(...\email\src\com\android\email\service): *Access must be synchronized,because there are accesses from the Controller callback
MailService.java(...\email\src\com\android\email\service): synchronized(sSynchronizeLock){
MailService.java(...\email\src\com\android\email\service): synchronized(sSynchronizeLock){
MailService.java(...\email\src\com\android\email\service): synchronized(mSyncReports){
MailService.java(...\email\src\com\android\email\service): synchronized(mSyncReports){
MailService.java(...\email\src\com\android\email\service): synchronized(mSyncReports){
MailService.java(...\email\src\com\android\email\service): synchronized(mSyncReports){
MailService.java(...\email\src\com\android\email\service): *Handle the work of setupSyncReports. Must be synchronized on mSyncReports.
MailService.java(...\email\src\com\android\email\service): synchronized(mSyncReports){
MailService.java(...\email\src\com\android\email\service): synchronized(mSyncReports){
MailTransport.java(...\email\src\com\android\email\mail\transport): synchronized(MailService.sSynchronizeLock){
MailTransport.java(...\email\src\com\android\email\mail\transport): synchronized(MailService.sSynchronizeLock){
MessageCompose.java(...\email\src\com\android\email\activity): synchronized(mDraft){
MessageCompose.java(...\email\src\com\android\email\activity): synchronized(sActiveSaveTasks){
MessageListFragment.java(...\email\src\com\android\email\activity): synchronized(MessagesAdapter.mDeletedSet){
MessagesAdapter.java(...\email\src\com\android\email\activity): publicsynchronized voidsetDeletedSet(Set<Long>set){
MessagesAdapter.java(...\email\src\com\android\email\activity): publicsynchronized voidclearDeletion(Set<Long>set){
MessagesAdapter.java(...\email\src\com\android\email\activity): synchronized(mDeletedSet){
MessagesAdapter.java(...\email\src\com\android\email\activity): synchronized(mDeletedSet){
MessageViewFragmentBase.java(...\email\src\com\android\email\activity): synchronized(mDownloadAttachmentList){
MessageViewFragmentBase.java(...\email\src\com\android\email\activity): synchronized(mDownloadAttachmentList){
MessageViewFragmentBase.java(...\email\src\com\android\email\activity): privatesynchronized voiddoLinkParse(Stringtext){
MessagingController.java(...\email\src\com\android\email): *All access tomListeners *must*be synchronized
MessagingController.java(...\email\src\com\android\email): publicsynchronized staticMessagingController getInstance(Context _context,
MessagingController.java(...\email\src\com\android\email): // they equal we can mark this SYNCHRONIZED instead of PARTIALLY_SYNCHRONIZED
MessagingController.java(...\email\src\com\android\email): synchronized(this){
MessagingController.java(...\email\src\com\android\email): synchronized(this){
MessagingController.java(...\email\src\com\android\email): // We do not synchronized this, because we expect the method poll()
MessagingController.java(...\email\src\com\android\email):// synchronized (this) {
MessagingController.java(...\email\src\com\android\email): synchronized(mCancelledAttachments){
MessagingController.java(...\email\src\com\android\email): synchronized(mCancelledAttachments){
MessagingController.java(...\email\src\com\android\email): synchronized(mCancelledAttachments){
MessagingListener.java(...\email\src\com\android\email): *@param accountId The account that was synchronized
MessagingListener.java(...\email\src\com\android\email): *@param mailboxId The mailbox that was synchronized
NotificationController.java(...\email\src\com\android\email): publicstaticsynchronized NotificationController getInstance(Context context){
NotificationController.java(...\email\src\com\android\email): privatestaticsynchronized voidensureHandlerExists(){
NotificationController.java(...\email\src\com\android\email): synchronized(mLock){
NotificationController.java(...\email\src\com\android\email): synchronized(mLock){
NullInputStream.java(...\email\emailcommon\src\org\apache\commons\io\input): publicsynchronized voidmark(intreadlimit){
NullInputStream.java(...\email\emailcommon\src\org\apache\commons\io\input): publicsynchronized voidreset()throwsIOException{
NullReader.java(...\email\emailcommon\src\org\apache\commons\io\input): publicsynchronized voidmark(intreadlimit){
NullReader.java(...\email\emailcommon\src\org\apache\commons\io\input): publicsynchronized voidreset()throwsIOException{
Pop3Store.java(...\email\src\com\android\email\mail\store): publicsynchronized voidopen(OpenMode mode)throwsMessagingException{
PopImapSyncAdapterService.java(...\email\src\com\android\email\service): synchronized(sSyncAdapterLock){
Preferences.java(...\email\src\com\android\email): publicstaticsynchronized Preferences getPreferences(Context context){
Preferences.java(...\email\src\com\android\email): publicsynchronized StringgetDeviceUID(){
ProxyInputStream.java(...\email\emailcommon\src\org\apache\commons\io\input): publicsynchronized voidmark(intidx){
ProxyInputStream.java(...\email\emailcommon\src\org\apache\commons\io\input): publicsynchronized voidreset()throwsIOException{
ProxyReader.java(...\email\emailcommon\src\org\apache\commons\io\input): publicsynchronized voidmark(intidx)throwsIOException{
ProxyReader.java(...\email\emailcommon\src\org\apache\commons\io\input): publicsynchronized voidreset()throwsIOException{
RecentMailboxManager.java(...\email\src\com\android\email\activity): publicstaticsynchronized RecentMailboxManager getInstance(Context context){
RecentMailboxManager.java(...\email\src\com\android\email\activity): privatesynchronized voidensureDefaultsInitialized(longaccountId,longtime){
RefreshManager.java(...\email\src\com\android\email): publicstaticsynchronized RefreshManager getInstance(Context context){
ResourceHelper.java(...\email\src\com\android\email): publicstaticsynchronized ResourceHelper getInstance(Context context){
Rfc822Output.java(...\email\emailcommon\src\com\android\emailcommon\internet): synchronized(Rfc822Output.class){
SecurityPolicy.java(...\email\src\com\android\email): publicsynchronized staticSecurityPolicy getInstance(Context context){
SecurityPolicy.java(...\email\src\com\android\email): publicsynchronized Policy getAggregatePolicy(){
SecurityPolicy.java(...\email\src\com\android\email): /* package */synchronized DevicePolicyManager getDPM(){
SecurityPolicy.java(...\email\src\com\android\email): publicsynchronized voidpoliciesUpdated(longaccountId){
Sender.java(...\email\src\com\android\email\mail): publicsynchronized staticSender getInstance(Context context,Account account)
ServiceProxy.java(...\email\emailcommon\src\com\android\emailcommon\service): synchronized(mConnection){
ServiceProxy.java(...\email\emailcommon\src\com\android\emailcommon\service): synchronized(mConnection){
SetupData.java(...\email\src\com\android\email\activity\setup): publicstaticsynchronized SetupData getInstance(){
SetupData.java(...\email\src\com\android\email\activity\setup): staticpublicsynchronized SetupData restore(Bundle bundle){
SimpleTempStorage.java(...\email\emailcommon\src\org\apache\james\mime4j\util): synchronized(this){
SSLUtils.java(...\email\emailcommon\src\com\android\emailcommon\utility): publicsynchronized staticSSLCertificateSocketFactory getSSLSocketFactory(
Store.java(...\email\src\com\android\email\mail): publicsynchronized staticStore getInstance(Account account,Context context)
Store.java(...\email\src\com\android\email\mail): publicsynchronized staticStore removeInstance(Account account,Context context)
TeeOutputStream.java(...\email\emailcommon\src\org\apache\commons\io\output): publicsynchronized voidwrite(byte[]b)throwsIOException{
TeeOutputStream.java(...\email\emailcommon\src\org\apache\commons\io\output): publicsynchronized voidwrite(byte[]b,intoff,intlen)throwsIOException{
TeeOutputStream.java(...\email\emailcommon\src\org\apache\commons\io\output): publicsynchronized voidwrite(intb)throwsIOException{
UnboundedFifoByteBuffer.java(...\email\emailcommon\src\org\apache\james\mime4j\decoder):*Note that thisimplementation isnotsynchronized. The following can be
UnboundedFifoByteBuffer.java(...\email\emailcommon\src\org\apache\james\mime4j\decoder):*used toprovide synchronized access toyour<code>UnboundedFifoByteBuffer</code>:
WidgetManager.java(...\email\src\com\android\email\widget): publicsynchronized voidcreateWidgets(Context context,int[]widgetIds){
WidgetManager.java(...\email\src\com\android\email\widget): publicsynchronized voiddeleteWidgets(Context context,int[]widgetIds){
WidgetManager.java(...\email\src\com\android\email\widget): publicsynchronized voidupdateWidgets(Context context,int[]widgetIds){
WidgetManager.java(...\email\src\com\android\email\widget): publicsynchronized voidupdateAllEmailWidgets(Context context){
WidgetManager.java(...\email\src\com\android\email\widget): publicsynchronized EmailWidget getOrCreateWidget(Context context,intwidgetId){
|
接下来看看数据库的db文件,从里面挑选了几个比较常用的Table,account存储账户信息,mailbox对应邮件文件夹,message对应的是邮件正文。
1
2
3
4
5
6
7
8
9
10
11
12
|
BEGINTRANSACTION;
insertinto<account>("_id","displayName","emailAddress","syncKey","syncLookback","syncInterval","hostAuthKeyRecv","hostAuthKeySend","flags","isDefault","compatibilityUuid","senderName","ringtoneUri","protocolVersion","newMessageCount","securityFlags","securitySyncKey","signature","policyKey","notifiedMessageId","notifiedMessageCount")
values('3','archcodevxxx@163.com','archcodevxxx@163.com',NULL,'-1','15','5','6','2057','0','cd4354ba-03c2-4089-8f42-61abec9c1744','archcodev','content://settings/system/notification_sound',NULL,'0',NULL,NULL,NULL,'0','0','0');
insertinto<mailbox>("_id","displayName","serverId","parentServerId","parentKey","accountKey","type","delimiter","syncKey","syncLookback","syncInterval","syncTime","unreadCount","flagVisible","flags","visibleLimit","syncStatus","messageCount","lastSeenMessageKey","lastTouchedTime")
values('17','已发送','已发送',NULL,'-1','3','5','47',NULL,'0','0','0','0','1','24','25',NULL,'0','0','1368427825017');
insertinto<message>("_id","syncServerId","syncServerTimeStamp","displayName","timeStamp","subject","flagRead","flagLoaded","flagFavorite","flagAttachment","flags","clientId","messageId","mailboxKey","accountKey","fromList","toList","ccList","bccList","replyToList","meetingInfo","snippet","protocolSearchInfo","size")
values('78','1319384458','1357011679000','Postmaster@163.com','1357011678000','系统退信','1','2','0','0','0',NULL,'<50E25ADE.7D4E04.17696@163smtp12>','25','3','Postmaster@163.com','archcodevxxx@163.com','','','',NULL,'
抱歉,您的邮件被退回来了…… 原邮件信息: 时 间: 2012-12-31 11:27:34 主 题: 回复:
验证金山快盘邮箱,免费获取1G空间 收件人: kuaipan@wps.cn 抄 送: xxx 密 送: yyy 退信原因:
您可能写了外星人的邮件地址;或者是网络不给力,我们无法与收信方联络上。 英文说明:Can not connect to
wps.cn:114.112.66.62:2',NULL,'13427');
COMMIT;
|
Android 3.0为了适配平板加入了Fragement的概念,下面以MessageListFragement为例子,看下消息是如何从view传到database的?本人比较关注结构方面,有点小建筑控 ,先看下这个类的结构,其中implements4个package外的接口,然后内部定义了2个接口
关注一个接口回掉的方法,下面是类图,简单解释下,当点击onclick()的时候调用回掉接口中定义的内容,其中 getTargetFragment()的用法比较有趣,和setTargetFragment()搭配使用。关于callback的使用最早解除是在C 中了解到了,他定义了一个接口模板,然后通过内嵌的方式突破权限的限制,使得Class A可以调用Class B的方法,同时能拆开Class AB的耦合,一举两得,不能在google工作也就只能拜读他们的代码咯。
疑问
在有网络时,是否也每次都是从数据库中取数据,换句话说就是先得从网络把数据存储到sqlite,然后再从db中取出显示?
参考
http://www.cnblogs.com/CrazyWill/archive/2006/07/03/441795.html
http://blog.sina.com.cn/s/blog_5d6ee3360100r1my.html
To be Continue…
原创文章,转载请注明: 转载自:-X archcodev
本文链接地址: Android App之Email浅析 && M0.0.6