Android短信(baseactivity抽取相同代码块,复用代码,减少工作量)短信管家4

从前面的第二第三篇博文我们可以看到他们有相似的功能:

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);		
		}
	}
}

是不是简单了很多哦??

以此类推,那么详细会话页面也就可以精简成这样了。这几天有点忙,所以项目暂时放了几天,到周末会将后续更新代码,以及添加的各个功能。


希望给初学的朋友带来的不仅仅是功能的实现,而是开发过程中的种种收获

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值