搬运自本人博客:http://www.xgezhang.com/android_sms.html
上一篇文章中我们学着写了一个电话拨号器,这里我们继续来写一个短信发送器。
同样的按一般app开发的步骤,首先先确定下UI界面,大致效果应该是这样:

那么界面要怎么完成了?这种布局可以采用线性布局来做,比较方便。这里还是采用的相对布局,先上xml文件:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 
 | 
    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context="com.example.sms.MainActivity"
>    <TextView        android:id="@+id/tv_input_number"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentLeft="true"        android:layout_alignParentTop="true"        android:text="@string/please_input_number"        android:textSize="20sp"        />    <EditText        android:singleLine="true"        android:id="@+id/et_number"        android:layout_width="match_parent"        android:layout_height="wrap_content"    android:layout_below="@id/tv_input_number"        android:inputType="phone"
>        <requestFocus
/>    </EditText>    <TextView        android:id="@+id/tv_input_content"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignLeft="@+id/et_number"        android:layout_below="@id/et_number"        android:text="@string/please_input_message"        android:textSize="20sp"        />         <EditText        android:lines="5"        android:id="@+id/et_content"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_alignLeft="@+id/et_number"        android:layout_below="@id/tv_input_content"        android:ems="10"        android:inputType="textMultiLine"
/>    <Button        android:id="@+id/bt_send"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_below="@+id/et_content"        android:text="@string/send_message"
/></RelativeLayout> | 
比较容易看懂,只是注意一下第二个EditText,有一个参数为android:lines=”5″,这里可以用来确定要显示的行数。
接下来我们来根据需求思考以下具体的代码该如何实现,我们要做以下几件事:
那首先是提取内容,直接用findViewById即可:
| 
 1 
2 
 | 
mEditTextNumber = (EditText) findViewById(R.id.et_number);mEditTextContent = (EditText) findViewById(R.id.et_content); | 
然后是注册点击事件,这里我们用另外一种更为常见的点击事件注册的写法来完成,即让MainActivity类来实现OnclickListener的接口,因此调用的时候只需要:
| 
 1 
2 
3 
4 
 | 
public
class 
MainActivity extends 
Activity implements 
OnClickListener {    Button bt_send = (Button) findViewById(R.id.bt_send);    bt_send.setOnClickListener(this);} | 
这种写法有一个好处,就是如果一个Activity上有10个按钮,采用内部类的方法的话就得写10个内部类,特别麻烦。而采用这种方法只需要实现一个函数即可,针对不同的按钮可以采用switch语句判断传递进来的到底是哪个按钮的id,然后根据返回值做出相应的动作。
最后就是去写接口未完成的函数 Onclick()了,和电话拨打器一样,我们可以判断以下填写的内容是否为空,然后用Toast.makeText来制作错误提示信息。短信发送我们采用的是内置的smsManager,在写SmsManager的时候,系统会提示说SmsManager已经被android.telephony替换,原因是SmsManager只支持GSM,而后者可以支持3G的一些制式,不过这里可以不用管它。
最后我们还要考虑到,对于一条短信,往往有字符的限制(比如中国一条短信是70个汉字),如果超过的话短信会发送失败。因此我们需要把这样的短信拆分出来,具体操作我们也不用担心,已经有写好的函数供我们调用了。具体实现参考如下代码:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
 | 
public
void 
onClick(View v) {        switch
(v.getId()) {        case
R.id.bt_send:            String content = mEditTextContent.getText().toString().trim();            String number = mEditTextNumber.getText().toString().trim();            if
(TextUtils.isEmpty(content)||TextUtils.isEmpty(number)){                Toast.makeText(this,
"电话号码或内容为空", Toast.LENGTH_SHORT);                return;            }
else{                SmsManager smsManager = SmsManager.getDefault();                //拆分短信 成为一个arrayList                ArrayList<String> contents = smsManager.divideMessage(content);                for
(String str: contents){                    smsManager.sendTextMessage(number,
null, str,
null 
,null);                }            }            break;        default:            break;        }    } | 
最后我们再在AndroidManifest文件中开启SEND_SMS的permission,部署到模拟器上,就可以进行测试了。

MainActivity.java 完整代码如下:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
 | 
package
com.example.sms;import
java.util.ArrayList;import
android.R.string;import
android.app.Activity;import
android.os.Bundle;import
android.telephony.gsm.SmsManager;import
android.text.TextUtils;import
android.view.View;import
android.view.View.OnClickListener;import
android.widget.Button;import
android.widget.EditText;import
android.widget.Toast;public
class 
MainActivity extends 
Activity implements 
OnClickListener {    private
EditText mEditTextNumber;    private
EditText mEditTextContent;         @Override    protected
void 
onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mEditTextNumber = (EditText) findViewById(R.id.et_number);        mEditTextContent = (EditText) findViewById(R.id.et_content);        Button bt_send = (Button) findViewById(R.id.bt_send);        bt_send.setOnClickListener(this);    }    @Override    public
void 
onClick(View v) {        switch
(v.getId()) {        case
R.id.bt_send:            String content = mEditTextContent.getText().toString().trim();            String number = mEditTextNumber.getText().toString().trim();            if
(TextUtils.isEmpty(content)||TextUtils.isEmpty(number)){                Toast.makeText(this,
"电话号码或内容为空", Toast.LENGTH_SHORT);                return;            }
else{                SmsManager smsManager = SmsManager.getDefault();                //拆分短信 成为一个arrayList                ArrayList<String> contents = smsManager.divideMessage(content);                for
(String str: contents){                    smsManager.sendTextMessage(number,
null, str,
null 
,null);                }            }            break;        default:            break;        }    }} | 
欢迎转载,请注明出处
原文:http://blog.csdn.net/u014237185/article/details/44947555