[原创]短信签名功能的实现

转载请注明原地址:http://www.cnblogs.com/zhouyuchao/archive/2012/09/29/2708657.html

一、简介:

当客户新建短信时,短信系统会根据客户的设置,在短信内容后面附加个性化签名,再发送给被叫手机客户。

如下图,新建短信时短信内容直接在后面已经附加了预设的个性化签名。

 

二、需求及功能:

1、当客户新建短信时,短信系统会根据客户的设置,在短信内容后面自动附加预设的个性化签名,如下图1

2、在短信设置中,添加短信签名开关,复选“开启签名”时,新建短信会自动添加个性签名,如下图2

3、在短信设置中,可以对短信签名内容进行预设和修改,如下图3

 

 

三、短信模块简介

从软件的功能角度来讲,Mms分为对话列表,消息列表,短信编辑,彩信编辑,短信显示,彩信显示和配置。

从实现的角度来看,它分为GUI展示层,发送/接收,彩信解析,彩信附件,信息数据等,这些分类对应着源码中的各种包

    下面介绍跟短信签名相关的两个包及相关文件:

1、Data包

---用于操作当前正在编辑的信息的相关数据,比如联系人列表、当前对话、当前消息。负责管理当前正在编辑的信息、当前所处的对话以及当前信息用到的联系人。

这些类都是在编辑信息的时候使用,由于这些多半都是用来管理数据的,而又无法直接做为对象传递给编辑器。所以它们的很多方法都是静态的,也就是这些类都近似单键。

1)WorkingMessage.java

---用来管理当前正在编辑的消息,它从创建,草稿到发送完成后一直存在,只要打开了编辑信息的页面就会创建一个WorkingMessage,直到退出编辑页面

2、Ui包

GUI展示层,用于展示对话列表,消息列表,消息编辑页,彩信附件编辑,彩信展示,播放幻灯片。负责直接与用户交互

1)ComposeMessageActivity.java

这个是核心的窗口Activity,编辑信息,显示一条对话Thread中的所有往来信息。MessageListView会加在其上面,AttachmentEditor也会加在其上面。这个Activity也负责响应外部应用程序,发送SENDTO或SEND等请求Intent,比如外部应用想要发送信息,等就由这个Activity来响应

2)BasicSlideEditorView.java

编辑某一页幻灯片时所用的布局,也就是在SlideEditorActivity.java中使用

3)MessagingPreferenceActivity.java

Mms的配置信息编辑器,用来编辑和更改配置信息,继承息PreferenceActivity。它负责与用户交互,显示和更改配置。在Mms启动时,MmsConfig会从SharedPreference中读出配置信息,在运行时其他的类的配置信息都是从MmsConfig中获取的,MmsConfig提供了很多Get方法以获取配置信息

 

更详细介绍请参考 http://www.linuxidc.com/Linux/2012-01/50929p2.htm

 

四、代码及实现

1、当客户新建短信时,在短信内容后面自动附加预设的个性化签名

当我们创建信息后信息处于编辑状态,而WorkingMessage.java用来管理当前正在编辑的消息,所以新建信息附加预设签名这功能主要在这个类操作。

原理:在新建信息时(新建的信息为空),用预设的文本替换原信息文本mText = this.mSignature

  /**

     * Sets the text of the message to the specified CharSequence.

     */

    public void setText(CharSequence s) {

      Log.d("zyc", "(WorkingMessage)setText.  start ,mText : "+ mText  + ",sign :  "+mEnableSignature);

        mText = s;

         

        // add by zyc 20120919 begin for mms signature

        if(TextUtils.isEmpty(mText)&& mEnableSignature){

             // 签名功能生效时,新建空信息自动附加签名信息   

             // mSignature为在信息设置里预设的文本

             mText = this.mSignature;   

             Log.d("signature"," (WorkingMessage)setText. Signature="+ mText); 

        }

        // add by zyc 20120919 end for mms signature

         

// a0

        if (mText != null && TextUtils.getTrimmedLength(mText) >= 0) {

            syncTextToSlideshow();

        }

// a1

        Log.d("zyc"," (WorkingMessage)setText.  end, mText : "+mText);

    }

 

添加获取短信设置中的签名开关和预设签名内容:

/**

     * 获取短信设置中的签名开关状态

     * @param  context

     * @return 返回短信签名开启状态

     */

    public static boolean enableSignature(Context context){

      SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);

      return sp.getBoolean("pref_key_enable_signature", false);

    }

    /**

     * 获取短信设置中预设的签名内容

     * @param  context

     * @return 返回短信签名内容

     */

    public static String getSignatureContent(Context context){

    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);

    return "\n"+ sp.getString("pref_key_edit_signature", "");

}

 

private WorkingMessage(ComposeMessageActivity activity) {

        mActivity = activity;

        mContentResolver = mActivity.getContentResolver();

        mStatusListener = activity;

        mAttachmentType = TEXT;

        mText = "";

        

        // add by zyc 20120919 begin for mms signature  

        // 获取签名开关状态

        mEnableSignature = enableSignature(activity);

        // 获取签名内容

        mSignature = getSignatureContent(activity);

        Log.d("zyc","(WorkingMessage)constructor.sign ="+mEnableSignature+"; content ="+mSignature);

      // add by zyc 20120919 end for mms signature

      

// a0

        updateCreationMode(activity);

// a1

    }

 

添加了签名内容后,需要对EditText的光标位置进行调整,将光标的位置设置在最开始处,在ComposeMessageActivity.java类中:

private void drawBottomPanel() {

。 。 。

if (text != null) {

       // add by zyc 20120919 begin for mms signature               

       if(WorkingMessage.mEnableSignature 

&& text.toString().trim().equals(WorkingMessage.mSignature.trim())){

           Log.d("signature","(ComposeMessageActivity)drawBottomPanel. OK!only signature in EditText:"

+WorkingMessage.getSignatureContent(this));     

 

           /* “设置文本”并不是调用setText,而是调用的setTextKeepState,后者相对于前者有一个优点,就是当界面此前stop掉,

            现在重新resume回来,那么此前光标所在位置仍然得以保存。而若使用setText,则光标会重置到行首*/

           mTextEditor.setTextKeepState(WorkingMessage.mSignature);

           // 将光标设置在最开始

           mTextEditor.setSelection(0);

       }else{

            mTextEditor.setTextKeepState(text);

       }       

/*            

mTextEditor.setTextKeepState(text);

//a0

        mTextEditor.setSelection(text.length());

//a1

*/        

        // add by zyc 20120919 end for mms signature 

    } else {

        mTextEditor.setText("");

    }

Log.d("signature","(ComposeMessageActivity) drawBottomPanel() end");

}

 

2、在短信设置中,添加短信签名开关和预设签名内容功能

1)在preferences.xml和multicardpreferences.xml中添加短信设置项

  <PreferenceCategory android:title="@string/pref_title_a_signature"

                        android:key="pref_key_signature_setting">

         <CheckBoxPreference android:key="pref_key_enable_signature"

                            android:title="@string/pref_title_enable_signature" 

                            android:summary="@string/pref_summary_add_personal" 

                            android:defaultValue="true"/>

         <EditTextPreference android:title="@string/pref_title_Personal_signature"

                            android:summary="@string/pref_summary_signature_content"

                            android:dialogTitle="@string/pref_title_Please_input_your_signature"

                            android:key="pref_key_edit_signature"

                            android:dependency="pref_key_enable_signature"

                            android:maxLength="50"

                            android:defaultValue="@string/signature_text_def"/>

     </PreferenceCategory>

 

2)在MessagingPreferenceActivity.java类中

private void setMessagePreferences() {

。 。 。

    // add by zyc 20120919 begin for mms signature  

    boolean enableSignature = getResources().getBoolean(R.bool.enable_signature);

    if(!enableSignature){

            PreferenceCategory signaturePref = (PreferenceCategory)findPreference(CATEGORY_SIGNATURE);

            getPreferenceScreen().removePreference(signaturePref);

    }

// add by zyc 20120919 end for mms signature    

}

 

3、在添加幻灯片附件时附加签名

public void setText(String name, String text) {

        mOnTextChangedListenerEnabled = false;

        // modify by zyc 20120919 begin for mms signature

        mOnTextChangedListenerEnabled = false;        

        Log.d("signature","BasicSlideEditorView. setText="+text+"; getText="+mEditText.getText().toString());

        if ((text != null) && !text.equals(mEditText.getText().toString())) {

           if(text.equals(WorkingMessage.mSignature)){

               mEditText.setText(WorkingMessage.mSignature);

               mEditText.setSelection(0);

           }else{

               mEditText.setText(text);

               mEditText.setSelection(text.length());

           }          

        }

        /*

        if ((text != null) && !text.equals(mEditText.getText().toString())) {

            mEditText.setText(text);

            mEditText.setSelection(text.length());

        }

        */

      // add by zyc 20120919 end for mms signature

        mOnTextChangedListenerEnabled = true;

    }

 

转载请注明原地址:http://www.cnblogs.com/zhouyuchao/archive/2012/09/29/2708657.html

posted on 2012-09-29 16:01  zyuchao  阅读(1101)  评论(0编辑  收藏  举报

导航