在短信列表,点击新建短信按钮,进入新建短信流程。

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

没有特别需要看的。。。



所以其实新建是特别简单的流程,什么都是新的,涉及到的就是收件人编辑框。对于收件人编辑框,我后面会有一个专门的博客来进行说明。