在短信列表,点击新建短信按钮,进入新建短信流程。
ConversationList.java
public void createNewMessage() {
startActivity(ComposeMessageActivity.createIntent(this, 0));
}
新建和打开已有的的区别是传递进去的threadId不一样,新建的threadId为0,也就是数据库中并没有记录。
ComposeMessageActivity.java
onCreate
Window window = ComposeMessageActivity.this.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
设置短信的系统bar,状态栏等的背景是透明的,所以最终效果是跟短信背景一体化。
initResourceRefs();初始化资源,里面具体内容读者自己查看,无非就是调用findViewById来获取控件
mBackgroundQueryHandler = new BackgroundQueryHandler(mContentResolver);这个是用来后台查询数据的
initialize(savedInstanceState, 0);初始化数据
我们主要来看initialize
mWorkingMessage = WorkingMessage.createEmpty(this);创建一个空的WorkingMessage,前面我们说过了,WorkingMessage表示一个正在编辑的短信
initActivityState(savedInstanceState);主要根据传递进来的Intent,来分析处理,对于新建短信,并没有什么需要加载的。后面分析
initMessageList();初始化短信历史列表
if (mConversation.getThreadId() <= 0//新建短信的threadId就是为0,所以走if分支
&& (!mConversation.isGroupChat() || mConversation.getGroupChat() == null)) {
// Hide the recipients editor so the call to initRecipientsEditor won't get
// short-circuited.
hideRecipientEditor();//收件人编辑框只有在新建短信的场景下才会有
initRecipientsEditor();//初始化收件人编辑框
updateColorPalette(sPrimaryColorDark);
setActionBarColor(sPrimaryColorDark);
} else {
hideRecipientEditor();
}
updateSendButtonState();更新发送按钮状态,只有收件人和短信发送内容都有的情况下,且短信可用,默认短信,sim卡可用的情况下,发送按钮才会enable
drawTopPanel(false);//这里的topPanel,是我们添加彩信附件的时候,会在文字编辑框上面出现的区域
if (!mShouldLoadDraft) {//在initialize上面进行判断的,是否加载草稿,新建符合savedInstanceState == null条件,所以是不需要加载草稿
// We're not loading a draft, so we can draw the bottom panel immediately.
drawBottomPanel();//主要绘制文字编辑框所在区域,每次调用这个,都会根据当前短信实时状态来绘制。
}
updateTitle(mConversation.getRecipients());//更新标题
onStart
initFocus();初始化焦点
第一次进入短信会话详情界面,焦点主要处于两个地方,要么新建短信等有收件人编辑框的,会处于收件人编辑框,要么焦点会在文本编辑框
if (isRecipientsEditorVisible()) {
mRecipientsEditor.addTextChangedListener(mRecipientsWatcher);
}
为收件人编辑框添加文本改变监听类,短信的各个状态都会因为收件人的输入删除而发送改变
registerReceiver(mHttpProgressReceiver, mHttpProgressFilter);
// Register a BroadcastReceiver to listen on SD card state.
registerReceiver(mMediaStateReceiver, getMediaStateFilter());
registerReceiver(mAirplaneModeBroadcastReceiver, mAirplaneModeFilter);
registerReceiver(mSimBroadcastReceiver, mSIMStatusChangeFilter);
注册各类广播
getWindow().setSoftInputMode(mode);软键盘相关
CharSequence text = mWorkingMessage.getText();//新建的话这里为null
if (text != null) {
mTextEditor.setTextKeepState(text);
}
if (!DEFER_LOADING_MESSAGES_AND_DRAFT) {
loadMessagesAndDraft(1);
} else {//我们会走else分支
// HACK: force load messages+draft after max delay, if it's not already loaded.
// this is to work around when coming out of sleep mode. WindowManager behaves
// strangely and hides the keyboard when it should be shown, or sometimes initially
// shows it when we want to hide it. In that case, we never get the onSizeChanged()
// callback w/ keyboard shown, so we wouldn't know to load the messages+draft.
mHandler.postDelayed(new Runnable() {
public void run() {
loadMessagesAndDraft(2);//查询短信历史记录和草稿,我们新建短信查询后为空,所以这里就不说了,留着后面说
}
}, LOADING_MESSAGES_AND_DRAFT_MAX_DELAY_MS);
}
onResume
没有特别需要看的。。。
所以其实新建是特别简单的流程,什么都是新的,涉及到的就是收件人编辑框。对于收件人编辑框,我后面会有一个专门的博客来进行说明。