[原创]短信签名功能的实现
转载请注明原地址: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;
}