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
(
231
in
56
files
)
--
--
AccountServerBaseFragment
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
activity
\
setup
)
:
public
static
synchronized
Bundle
getSettingsModeArgs
(
Long
accountID
)
{
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
)
:
public
synchronized
void
onChange
(
Context
context
,
Attachment
att
)
{
AttachmentDownloadService
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
service
)
:
/*package*/
synchronized
DownloadRequest
findDownloadRequest
(
long
id
)
{
AttachmentDownloadService
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
service
)
:
public
synchronized
boolean
isEmpty
(
)
{
AttachmentDownloadService
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
service
)
:
/*package*/
synchronized
void
processQueue
(
)
{
AttachmentDownloadService
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
service
)
:
/*package*/
synchronized
int
downloadsForAccount
(
long
accountId
)
{
AttachmentDownloadService
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
service
)
:
/*package*/
synchronized
boolean
tryStartDownload
(
DownloadRequest
req
)
{
AttachmentDownloadService
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
service
)
:
private
synchronized
DownloadRequest
getDownloadInProgress
(
long
attachmentId
)
{
AttachmentDownloadService
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
service
)
:
/*package*/
synchronized
void
endDownload
(
long
attachmentId
,
int
statusCode
)
{
AttachmentDownloadService
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
service
)
:
synchronized
(
mLock
)
{
AttachmentDownloadService
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
service
)
:
private
synchronized
Intent
getServiceIntentForAccount
(
long
accountId
)
{
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
)
:
public
synchronized
void
write
(
int
b
)
{
ByteArrayOutputStream
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
org
\
apache
\
commons
\
io
\
output
)
:
public
synchronized
int
write
(
InputStream
in
)
throws
IOException
{
ByteArrayOutputStream
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
org
\
apache
\
commons
\
io
\
output
)
:
public
synchronized
int
size
(
)
{
ByteArrayOutputStream
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
org
\
apache
\
commons
\
io
\
output
)
:
public
synchronized
void
reset
(
)
{
ByteArrayOutputStream
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
org
\
apache
\
commons
\
io
\
output
)
:
public
synchronized
void
writeTo
(
OutputStream
out
)
throws
IOException
{
ByteArrayOutputStream
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
org
\
apache
\
commons
\
io
\
output
)
:
public
synchronized
byte
[
]
toByteArray
(
)
{
CloseShieldInputStream
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
org
\
apache
\
james
\
mime4j
)
:
public
synchronized
void
reset
(
)
throws
IOException
{
CloseShieldInputStream
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
org
\
apache
\
james
\
mime4j
)
:
public
synchronized
void
mark
(
int
readlimit
)
{
ContentCache
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
provider
)
:
*
Synchronization
note
:
All
of
the
public
methods
in
ContentCache
are
synchronized
(
i
.
e
.
on
the
ContentCache
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
provider
)
:
*
A
synchronized
reference
counter
for
arbitrary
objects
ContentCache
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
provider
)
:
/*package*/
synchronized
int
subtract
(
T
object
)
{
ContentCache
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
provider
)
:
/*package*/
synchronized
void
add
(
T
object
)
{
ContentCache
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
provider
)
:
/*package*/
synchronized
boolean
contains
(
T
object
)
{
ContentCache
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
provider
)
:
/*package*/
synchronized
int
getCount
(
T
object
)
{
ContentCache
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
provider
)
:
synchronized
int
size
(
)
{
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
)
:
public
synchronized
CacheToken
getCacheToken
(
String
id
)
{
ContentCache
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
provider
)
:
public
synchronized
Cursor
putCursorImpl
(
Cursor
c
,
String
id
,
String
[
]
projection
,
ContentCache
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
provider
)
:
public
synchronized
Cursor
getCachedCursor
(
String
id
,
String
[
]
projection
)
{
ContentCache
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
provider
)
:
public
synchronized
void
lock
(
String
id
)
{
ContentCache
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
provider
)
:
public
synchronized
void
unlock
(
String
id
)
{
ContentCache
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
provider
)
:
public
synchronized
void
unlock
(
String
id
,
ContentValues
values
)
{
ContentCache
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
provider
)
:
public
synchronized
void
invalidate
(
)
{
ContentCache
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
provider
)
:
public
synchronized
void
invalidate
(
String
operation
,
Uri
uri
,
String
selection
)
{
ContentCache
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
provider
)
:
public
static
synchronized
void
notCacheable
(
Uri
uri
,
String
selection
)
{
Controller
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
public
synchronized
static
Controller
getInstance
(
Context
_context
)
{
Controller
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
public
synchronized
static
void
injectMockControllerForTest
(
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
(
and
not
risk
creating
duplicate
boxes
)
.
Controller
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
public
synchronized
long
findOrCreateMailboxOfType
(
long
accountId
,
int
mailboxType
)
{
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
public
void
sendPendingMessagesStarted
(
long
accountId
,
long
messageId
)
{
Controller
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
synchronized
(
mListeners
)
{
Controller
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
synchronized
public
void
sendPendingMessagesCompleted
(
long
accountId
)
{
Controller
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
synchronized
(
mListeners
)
{
Controller
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
synchronized
public
void
sendPendingMessagesFailed
(
long
accountId
,
long
messageId
,
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
)
:
private
synchronized
void
broadcastCallback
(
ServiceCallbackWrapper
wrapper
)
{
CountingInputStream
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
org
\
apache
\
commons
\
io
\
input
)
:
public
synchronized
int
getCount
(
)
{
CountingInputStream
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
org
\
apache
\
commons
\
io
\
input
)
:
public
synchronized
int
resetCount
(
)
{
CountingInputStream
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
org
\
apache
\
commons
\
io
\
input
)
:
public
synchronized
long
getByteCount
(
)
{
CountingInputStream
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
org
\
apache
\
commons
\
io
\
input
)
:
public
synchronized
long
resetByteCount
(
)
{
CountingOutputStream
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
org
\
apache
\
commons
\
io
\
output
)
:
public
synchronized
int
getCount
(
)
{
CountingOutputStream
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
org
\
apache
\
commons
\
io
\
output
)
:
public
synchronized
int
resetCount
(
)
{
CountingOutputStream
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
org
\
apache
\
commons
\
io
\
output
)
:
public
synchronized
long
getByteCount
(
)
{
CountingOutputStream
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
org
\
apache
\
commons
\
io
\
output
)
:
public
synchronized
long
resetByteCount
(
)
{
Device
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
com
\
android
\
emailcommon
)
:
static
public
synchronized
String
getDeviceId
(
Context
context
)
throws
IOException
{
Email
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
public
static
synchronized
void
setNotifyUiAccountsChanged
(
boolean
setFlag
)
{
Email
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
public
static
synchronized
boolean
getNotifyUiAccountsChanged
(
)
{
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
)
:
public
synchronized
void
registerClientCert
(
EmailClientConnectionManager
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
com
\
android
\
emailcommon
\
utility
)
:
public
synchronized
void
unregisterClientCert
(
EmailClientConnectionManager
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
com
\
android
\
emailcommon
\
utility
)
:
public
synchronized
boolean
hasDetectedUnsatisfiedCertReq
(
long
since
)
{
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
)
:
public
synchronized
RemoteViews
getViewAt
(
int
position
)
{
FileCleaner
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
org
\
apache
\
commons
\
io
)
:
public
static
synchronized
void
exitWhenFinished
(
)
{
FileCleaningTracker
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
org
\
apache
\
commons
\
io
)
:
final
Collection
<
Tracker
>
/* Tracker */
trackers
=
new
Vector
<
Tracker
>
(
)
;
// synchronized
FileCleaningTracker
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
org
\
apache
\
commons
\
io
)
:
private
synchronized
void
addTracker
(
String
path
,
Object
marker
,
FileDeleteStrategy
deleteStrategy
)
{
FileCleaningTracker
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
org
\
apache
\
commons
\
io
)
:
// synchronized block protects reaper
FileCleaningTracker
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
org
\
apache
\
commons
\
io
)
:
public
synchronized
void
exitWhenFinished
(
)
{
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
)
:
public
static
synchronized
FolderProperties
getInstance
(
Context
context
)
{
FolderProperties
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
public
static
synchronized
void
removeInstance
(
)
{
GroupMessagingListener
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
Nevertheless
,
let'
s
keep
the
"synchronized"
for
a
while
in
the
case
GroupMessagingListener
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
synchronized
public
void
addListener
(
MessagingListener
listener
)
{
GroupMessagingListener
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
synchronized
public
void
removeListener
(
MessagingListener
listener
)
{
GroupMessagingListener
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
synchronized
public
boolean
isActiveListener
(
MessagingListener
listener
)
{
GroupMessagingListener
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
synchronized
public
void
listFoldersStarted
(
long
accountId
)
{
GroupMessagingListener
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
synchronized
public
void
listFoldersFailed
(
long
accountId
,
String
message
)
{
GroupMessagingListener
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
synchronized
public
void
listFoldersFinished
(
long
accountId
)
{
GroupMessagingListener
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
synchronized
public
void
synchronizeMailboxStarted
(
long
accountId
,
long
mailboxId
)
{
GroupMessagingListener
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
synchronized
public
void
synchronizeEnvelopeFinished
(
long
accountId
,
long
mailboxId
)
{
GroupMessagingListener
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
synchronized
public
void
synchronizeMailboxFinished
(
long
accountId
,
long
mailboxId
,
GroupMessagingListener
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
synchronized
public
void
synchronizeMailboxFailed
(
long
accountId
,
long
mailboxId
,
Exception
e
)
{
GroupMessagingListener
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
synchronized
public
void
loadMessageForViewStarted
(
long
messageId
)
{
GroupMessagingListener
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
synchronized
public
void
loadMessageForViewFinished
(
long
messageId
)
{
GroupMessagingListener
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
synchronized
public
void
loadMessageForViewFailed
(
long
messageId
,
String
message
)
{
GroupMessagingListener
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
synchronized
public
void
checkMailStarted
(
Context
context
,
long
accountId
,
long
tag
)
{
GroupMessagingListener
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
synchronized
public
void
checkMailFinished
(
Context
context
,
long
accountId
,
long
folderId
,
GroupMessagingListener
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
synchronized
public
void
sendPendingMessagesStarted
(
long
accountId
,
long
messageId
)
{
GroupMessagingListener
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
synchronized
public
void
sendPendingMessagesCompleted
(
long
accountId
)
{
GroupMessagingListener
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
synchronized
public
void
sendPendingMessagesFailed
(
long
accountId
,
long
messageId
,
GroupMessagingListener
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
synchronized
public
void
messageUidChanged
(
long
accountId
,
long
mailboxId
,
GroupMessagingListener
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
synchronized
public
void
loadAttachmentStarted
(
GroupMessagingListener
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
synchronized
public
void
loadAttachmentFinished
(
GroupMessagingListener
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
synchronized
public
void
loadAttachmentFailed
(
GroupMessagingListener
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
synchronized
public
void
controllerCommandCompleted
(
boolean
moreCommandsToRun
)
{
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
)
:
public
static
synchronized
int
inferMailboxTypeFromName
(
Context
context
,
String
mailboxName
)
{
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
)
:
public
synchronized
void
setDeletedSet
(
Set
<
Long
>
set
)
{
MessagesAdapter
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
activity
)
:
public
synchronized
void
clearDeletion
(
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
)
:
private
synchronized
void
doLinkParse
(
String
text
)
{
MessagingController
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
*
All
access
to
mListeners *
must*
be
synchronized
MessagingController
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
public
synchronized
static
MessagingController
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
)
:
public
static
synchronized
NotificationController
getInstance
(
Context
context
)
{
NotificationController
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
private
static
synchronized
void
ensureHandlerExists
(
)
{
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
)
:
public
synchronized
void
mark
(
int
readlimit
)
{
NullInputStream
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
org
\
apache
\
commons
\
io
\
input
)
:
public
synchronized
void
reset
(
)
throws
IOException
{
NullReader
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
org
\
apache
\
commons
\
io
\
input
)
:
public
synchronized
void
mark
(
int
readlimit
)
{
NullReader
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
org
\
apache
\
commons
\
io
\
input
)
:
public
synchronized
void
reset
(
)
throws
IOException
{
Pop3Store
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
mail
\
store
)
:
public
synchronized
void
open
(
OpenMode
mode
)
throws
MessagingException
{
PopImapSyncAdapterService
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
service
)
:
synchronized
(
sSyncAdapterLock
)
{
Preferences
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
public
static
synchronized
Preferences
getPreferences
(
Context
context
)
{
Preferences
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
public
synchronized
String
getDeviceUID
(
)
{
ProxyInputStream
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
org
\
apache
\
commons
\
io
\
input
)
:
public
synchronized
void
mark
(
int
idx
)
{
ProxyInputStream
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
org
\
apache
\
commons
\
io
\
input
)
:
public
synchronized
void
reset
(
)
throws
IOException
{
ProxyReader
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
org
\
apache
\
commons
\
io
\
input
)
:
public
synchronized
void
mark
(
int
idx
)
throws
IOException
{
ProxyReader
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
org
\
apache
\
commons
\
io
\
input
)
:
public
synchronized
void
reset
(
)
throws
IOException
{
RecentMailboxManager
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
activity
)
:
public
static
synchronized
RecentMailboxManager
getInstance
(
Context
context
)
{
RecentMailboxManager
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
activity
)
:
private
synchronized
void
ensureDefaultsInitialized
(
long
accountId
,
long
time
)
{
RefreshManager
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
public
static
synchronized
RefreshManager
getInstance
(
Context
context
)
{
ResourceHelper
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
public
static
synchronized
ResourceHelper
getInstance
(
Context
context
)
{
Rfc822Output
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
com
\
android
\
emailcommon
\
internet
)
:
synchronized
(
Rfc822Output
.
class
)
{
SecurityPolicy
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
public
synchronized
static
SecurityPolicy
getInstance
(
Context
context
)
{
SecurityPolicy
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
public
synchronized
Policy
getAggregatePolicy
(
)
{
SecurityPolicy
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
/* package */
synchronized
DevicePolicyManager
getDPM
(
)
{
SecurityPolicy
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
)
:
public
synchronized
void
policiesUpdated
(
long
accountId
)
{
Sender
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
mail
)
:
public
synchronized
static
Sender
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
)
:
public
static
synchronized
SetupData
getInstance
(
)
{
SetupData
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
activity
\
setup
)
:
static
public
synchronized
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
)
:
public
synchronized
static
SSLCertificateSocketFactory
getSSLSocketFactory
(
Store
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
mail
)
:
public
synchronized
static
Store
getInstance
(
Account
account
,
Context
context
)
Store
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
mail
)
:
public
synchronized
static
Store
removeInstance
(
Account
account
,
Context
context
)
TeeOutputStream
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
org
\
apache
\
commons
\
io
\
output
)
:
public
synchronized
void
write
(
byte
[
]
b
)
throws
IOException
{
TeeOutputStream
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
org
\
apache
\
commons
\
io
\
output
)
:
public
synchronized
void
write
(
byte
[
]
b
,
int
off
,
int
len
)
throws
IOException
{
TeeOutputStream
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
org
\
apache
\
commons
\
io
\
output
)
:
public
synchronized
void
write
(
int
b
)
throws
IOException
{
UnboundedFifoByteBuffer
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
org
\
apache
\
james
\
mime4j
\
decoder
)
:
*
Note
that
this
implementation
is
not
synchronized
.
The
following
can
be
UnboundedFifoByteBuffer
.
java
(
.
.
.
\
email
\
emailcommon
\
src
\
org
\
apache
\
james
\
mime4j
\
decoder
)
:
*
used
to
provide
synchronized
access
to
your
<
code
>
UnboundedFifoByteBuffer
<
/
code
>
:
WidgetManager
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
widget
)
:
public
synchronized
void
createWidgets
(
Context
context
,
int
[
]
widgetIds
)
{
WidgetManager
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
widget
)
:
public
synchronized
void
deleteWidgets
(
Context
context
,
int
[
]
widgetIds
)
{
WidgetManager
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
widget
)
:
public
synchronized
void
updateWidgets
(
Context
context
,
int
[
]
widgetIds
)
{
WidgetManager
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
widget
)
:
public
synchronized
void
updateAllEmailWidgets
(
Context
context
)
{
WidgetManager
.
java
(
.
.
.
\
email
\
src
\
com
\
android
\
email
\
widget
)
:
public
synchronized
EmailWidget
getOrCreateWidget
(
Context
context
,
int
widgetId
)
{
|
接下来看看数据库的db文件,从里面挑选了几个比较常用的Table,account存储账户信息,mailbox对应邮件文件夹,message对应的是邮件正文。
1
2
3
4
5
6
7
8
9
10
11
12
|
BEGIN
TRANSACTION
;
insert
into
<
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'
)
;
insert
into
<
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'
)
;
insert
into
<
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