详细代码流程
Welcome.java:首先在Welcome.java的onCreate()方法中,判断当前账户的数量
try {
c = getContentResolver().query(
EmailContent.Account.CONTENT_URI,
EmailContent.Account.ID_PROJECTION,
null,null,null);
switch (c.getCount()) {
case 0:
AccountSetupGuide.actionSetupGuide(this);
break;
case 1:
c.moveToFirst();
long accountId = c.getLong(EmailContent.Account.CONTENT_ID_COLUMN);
MessageList.actionHandleAccount(this, accountId, Mailbox.TYPE_INBOX);
break;
default:
AccountFolderList.actionShowAccounts(this);
break;
}
} finally {
if (c !=null) {
c.close();
}
}
当c.getcount()为1时,直接进入MessageList打开该账户的Inbox。
当c.getcount()为0时,进入AccountSetupGuide去新建账户。
否则,进入AccountFolderList去选择账户。
AccountSetupGuide.java:列出不同类型的账户供用户选择,并监听用户的操作
list.setOnItemClickListener(new OnItemClickListener(){
publicvoid onItemClick(AdapterView<?> adapterView, View view,int position,long id) {
BooleanisExchangePositionCustom = (1 == Settings.Systemex.getInt(getContentResolver(), "exchange_position_custom", 0));
if (!isExchangePositionCustom && (position == 0)) {
onExchangeAccountSetup();
}elseif (isExchangePositionCustom && (position ==mListSuffixs.size()-2)) {
onExchangeAccountSetup(); //Exchange
} else
if (position >=mListSuffixs.size()-1) {
onOtherAccountSetup(); //普通email
} else {
onPresetAccountSetup(position); //预置email类型
}
}
});
无论选择哪个,都会进入AccountSetupBasics.java类,但是发送的intent不同。
privatevoid onExchangeAccountSetup() {
AccountSetupBasics.actionSetupExchange(this);
}
privatevoid onOtherAccountSetup() {
AccountSetupBasics.actionNewAccount(this);
}
privatevoid onPresetAccountSetup(int position) {
AccountSetupBasics.actionNewAccount(this,mListSuffixs.get(position));
}
AccountSetupBasics.java:处理与用户输入的交互,这里要求用户输入账户地址,密码(exchange还需要域名和用户名),然后通过finishAutoSetup()和onManualSetup()两个方法进行设置。若finishAutoSetup()出现异常,都会调用onManualSetup()。
主要完成如下动作:保存email(地址),domain(域名),user(用户名),password(密码),由Provider提供incomingUsername,incomingUriTemplate,outgoingUsername,outgoingUriTemplate;设置默认签名,默认同步间隔。
若是exchange类型账户,
if (mEasAccount) {
// TODO: Confirm correct delete policy for exchange
mAccount.setDeletePolicy(Account.DELETE_POLICY_ON_DELETE);
mAccount.setSyncInterval(Account.CHECK_INTERVAL_PUSH);
mAccount.setSyncInterval(mDefaultCheckInterval);
mAccount.setSyncLookback(1);
AccountSetupExchange.actionIncomingSettings(this,mAccount,mDefaultView.isChecked(),mEasFlowMode,
allowAutoDiscover, true);
return;
}
其他类型,则
AccountSetupIncoming.actionIncomingSettings(this, mAccount, mDefaultView.isChecked(), true);
AccountSetupExchange.java:保存如下信息: Email Address (from previous setup screen),Server,Domain,是否要求Requires SSL, User (login), Password。调用loadFields(mAccount)将这些信息显示在UI。然后调用AccountSetupCheckSettings.java,进行设置检查,如果返回值为RESULT_OK,则执行doOptions(),调用AccountSetupOptions.java。
AccountSetupCheckSettings.java:开启新线程调用store.autoDiscover()进行配置检查,并对返回值进行处理。如果返回值为RESULT_OK,则finish();是错误的状态值,则弹出showErrorDialog()。
AccountSetupIncoming.java:分支代码。主要进行接收服务器设置,设置接受协议和端口。(AccountSetupOutgoing.java:外发服务器设置,外发协议及端口)。由于界面优化,现在功能实现都整合在AccountSetupIncoming.java中实现了。用户可以切换pop3/imap类型,则调用changeToImap()和changeToPop3()更新端口和安全策略。
AccountSetupOptions.java:显示默认同步间隔,是否为默认账户,exchange还显示同步联系人及日历初始状态。用户
AccountSetupNames.java:设置账户姓名(exchange不需要)和外发显示姓名。设置之后下一步会调用AccountBackupStore.java(调用EmailContent.java的public Uri save(Context context))将账户信息写入数据库。