從前面的第二第三篇博文我們可以看到他們有相似的功能:
1:發送短信功能
2:接收發送回執的廣播接收者
3:註冊廣播接收者,和unregist 廣播接收者
4:保存短信到短信數據庫
5:....暫時沒了(但是隨着以後代碼的擴展,如果需要複用的部分,都可以放到基類中去,不是很好嗎)
分析一下這麼寫的好處:
1:代碼簡潔很多,不需要去寫很多重複的代碼,達到代碼複用的目的
2:給後續開發帶來方便(例如我們後續需要使用 發送短信的功能的時候,只要讓那個類直接繼承我們這個基類就OK了)
3:便於修改代碼,如果我們發現某一個地方有問題,我們只需要到基類中修改,不需要每個地方都去修改,提高效率
4:.....好處很多啦,自己想吧,哈哈哈
好了,下面我們就完成一下這樣的抽取,把這些功能都拿到一個 BASEACTIVITY中,我們暫時給它取名字叫 BaseMsgActivity。
注意,我們的 BaseMsgActivity 中涉及到1-5的這些方法,或者變量,如果需要給繼承的類去使用,那麼我們使用 protected關鍵字,如果不需要提供給子類使用,那麼我們使用private關鍵字,目前,我們沒有對外的,所以不需要public關鍵字,當然更不需要static關鍵字
我把基類放上來
package com.xiaoxu.message;
import java.util.ArrayList;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.widget.Toast;
public class BaseMsgActivity extends Activity {
/* 自定義ACTION常數,作爲廣播的Intent Filter識別常數 */
private final String SMS_SEND_ACTIOIN = "SMS_SEND_ACTIOIN";
private final String SMS_DELIVERED_ACTION = "SMS_DELIVERED_ACTION";
private mServiceReceiver mReceiver01, mReceiver02;
private String msg,tel;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
protected void onResume() {
/* 自定義IntentFilter爲SENT_SMS_ACTIOIN Receiver */
IntentFilter mFilter01;
mFilter01 = new IntentFilter(SMS_SEND_ACTIOIN);
mReceiver01 = new mServiceReceiver();
registerReceiver(mReceiver01, mFilter01);
/* 自定義IntentFilter爲DELIVERED_SMS_ACTION Receiver */
mFilter01 = new IntentFilter(SMS_DELIVERED_ACTION);
mReceiver02 = new mServiceReceiver();
registerReceiver(mReceiver02, mFilter01);
super.onResume();
}
@Override
protected void onPause()
{
/* 取消註冊自定義Receiver */
unregisterReceiver(mReceiver01);
unregisterReceiver(mReceiver02);
super.onPause();
}
protected void saveMine(String msg,String tel){
ContentValues values = new ContentValues();
values.put("date", System.currentTimeMillis()); //發送時間
values.put("read", 0); //閱讀狀態
values.put("type", 2); //1爲收 2爲發
values.put("address",tel); //送達號碼
values.put("body", msg); //送達內容
getContentResolver().insert(Uri.parse("content://sms/sent"), values); //插入短信庫
}
protected void saveToMe(String msg,String tel){
ContentValues values = new ContentValues();
values.put("date", System.currentTimeMillis()); //發送時間
values.put("read", 0); //閱讀狀態
values.put("type", 1); //1爲收 2爲發
values.put("address",tel); //送達號碼
values.put("body", msg); //送達內容
getContentResolver().insert(Uri.parse("content://sms/sent"), values); //插入短信庫
}
protected void talk(String content,String number) {
String contentshot = content;
SmsManager smsManager = SmsManager.getDefault();
Intent itSend = new Intent(SMS_SEND_ACTIOIN);/* 建立自定義Action常數的Intent(給PendingIntent參數之用) */
PendingIntent mSendPI = PendingIntent.getBroadcast(/* sentIntent參數爲傳送後接受的廣播信息PendingIntent */
getApplicationContext(), 0, itSend, 0);
ArrayList<String> list = smsManager.divideMessage(contentshot); // 使用短信管理器把短信分段
if (list.size() == 0) {
Toast.makeText(getApplicationContext(), R.string.content_empty,
Toast.LENGTH_SHORT).show(); // 彈出通知
return;
}
for (String sms : list) { // 逐段發送
smsManager.sendTextMessage(number, null, sms, mSendPI, null); // 使用短信管理器發送指定內容到指定號碼上
}
}
/**
* 羣發消息使用
* @param num
* @param content
*/
protected void send(String num,String content) {
String number = "";
if(!num.endsWith(";")){
num += ";";
number = num.substring(0, num.indexOf(";"));
SmsManager smsManager = SmsManager.getDefault();
Intent itSend = new Intent(SMS_SEND_ACTIOIN);
PendingIntent mSendPI = PendingIntent.getBroadcast(getApplicationContext(), 0, itSend, 0);
ArrayList<String> list = smsManager.divideMessage(content); // 使用短信管理器把短信分段
if (list.size() == 0) {
Toast.makeText(getApplicationContext(), R.string.content_empty, Toast.LENGTH_SHORT).show(); // 彈出通知
return;
}
for (String sms : list) { // 逐段發送
smsManager.sendTextMessage(number, null, sms, mSendPI, null); // 使用短信管理器發送指定內容到指定號碼上
}
return;
}
while(num.length()>0){
//拿一個號碼,發一個號碼
number = num.substring(0, num.indexOf(";"));
SmsManager smsManager = SmsManager.getDefault();
Intent itSend = new Intent(SMS_SEND_ACTIOIN);
PendingIntent mSendPI = PendingIntent.getBroadcast(getApplicationContext(), 0, itSend, 0);
ArrayList<String> list = smsManager.divideMessage(content); // 使用短信管理器把短信分段
if (list.size() == 0) {
Toast.makeText(getApplicationContext(), R.string.content_empty, Toast.LENGTH_SHORT).show(); // 彈出通知
return;
}
for (String sms : list) { // 逐段發送
smsManager.sendTextMessage(number, null, sms, mSendPI, null); // 使用短信管理器發送指定內容到指定號碼上
}
if(num.length()>num.indexOf(";")+1){
num = num.substring(num.indexOf(";")+1);
}else{
break;
}
}
}
/***
* 這一塊我喜歡這麼寫,對外只提供寫方法,不提供讀方法
* @param msg
*/
protected void setMsg(String msg) {
this.msg = msg;
}
protected void setTel(String tel) {
this.tel = tel;
}
/**
*
* 自定義mServiceReceiver重寫BroadcastReceiver監聽短信狀態信息
*
*/
private class mServiceReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
if (intent.getAction().equals(SMS_SEND_ACTIOIN))
{
try
{
switch(getResultCode())
{
case Activity.RESULT_OK:
/* 發送短信成功 */
Toast.makeText(getApplicationContext(), "發送成功", 0).show();
saveMine(msg,tel);
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
/* 發送短信失敗 */
Toast.makeText(getApplicationContext(), "發送失敗", 0).show();
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
break;
}
}
catch(Exception e)
{
Toast.makeText(getApplicationContext(), "發送失敗", 0).show();
e.getStackTrace();
}
}
//暫時未使用
else if(intent.getAction().equals(SMS_DELIVERED_ACTION))
{
try
{
/* android.content.BroadcastReceiver.getResultCode()方法 */
switch(getResultCode())
{
case Activity.RESULT_OK:
/* 短信 */
Toast.makeText(getApplicationContext(), "發送成功", 0).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
/* 短信未送達 */
Toast.makeText(getApplicationContext(), "發送失敗", 0).show();
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
break;
}
}
catch(Exception e)
{
Toast.makeText(getApplicationContext(), "發送失敗", 0).show();
e.getStackTrace();
}
}
}
}
}
只需要一個這樣的基類,那麼我們的開發就簡單很多了
我們可以到第二篇博客看下原來的發送短信,用了多少代碼,現在,我把代碼抽取後的發送短信頁面的代碼放上來
package com.xiaoxu.message;
import java.util.ArrayList;
import java.util.List;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.xiaoxu.message.bean.ContactInfo;
import com.xiaoxu.message.util.SoundPoolButton;
public class NewMessageActivity extends BaseMsgActivity implements OnClickListener {
private SoundPoolButton soundpool;
private EditText numET;
private EditText contentET;
private Button addcontact,send,cancel;
private List<ContactInfo> select;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_newmessage);
soundpool = new SoundPoolButton(this);
numET = (EditText) findViewById(R.id.et_number); // 獲取2個文本框
contentET = (EditText) findViewById(R.id.et_content);
addcontact = (Button) findViewById(R.id.bt_contact);
send = (Button) findViewById(R.id.bt_send);
cancel = (Button) findViewById(R.id.bt_cancel);
addcontact.setOnClickListener(this);
send.setOnClickListener(this);
cancel.setOnClickListener(this);
}
@Override
public void onClick(View view) {
soundpool.play();
switch(view.getId()){
case R.id.bt_contact:
String[] items={"查看全部","查看SIM卡","查看手機"};
new AlertDialog.Builder(this) //
.setTitle("選擇聯繫人") //
.setCancelable(true) //
.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch(which){
case 0:
Intent intent = new Intent(NewMessageActivity.this,ContactActivity.class);
startActivityForResult(intent, 0);
break;
case 1:break;
case 2:break;
}
}
}) // listener 爲OnClickListener 監聽器對象, 監聽列表項被選中
.show();
break;
case R.id.bt_send:
send(numET.getText().toString().trim(),contentET.getText().toString().trim());
//TODO 跳轉到發送消息頁面
break;
case R.id.bt_cancel:
finish();
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(data!=null){
Gson gson = new Gson();
// System.out.println(data.getStringExtra("return"));
String str = data.getStringExtra("return");
select = gson.fromJson(str, new TypeToken<ArrayList<ContactInfo>>(){}.getType());
String number = new String();
for(int i= 0;i<select.size();i++){
if(number!=null&&number.length()>1){
number += ";"+select.get(i).getUserNumber();
}else{
number = select.get(i).getUserNumber();
}
}
number+=";";
numET.setText(number);
super.onActivityResult(requestCode, resultCode, data);
}
}
}
是不是簡單了很多哦??
以此類推,那麼詳細會話頁面也就可以精簡成這樣了。這幾天有點忙,所以項目暫時放了幾天,到週末會將後續更新代碼,以及添加的各個功能。
希望給初學的朋友帶來的不僅僅是功能的實現,而是開發過程中的種種收穫