搬运自本人博客: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