从前面的第二第三篇博文我们可以看到他们有相似的功能:
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); } } }
以此类推,那么详细会话页面也就可以精简成这样了。这几天有点忙,所以项目暂时放了几天,到周末会将后续更新代码,以及添加的各个功能。
希望给初学的朋友带来的不仅仅是功能的实现,而是开发过程中的种种收获