標籤:android 開發執行個體
最近做了一個簡單的簡訊操作模組,比較實用小巧。主要功能是可以傳送簡訊(包括簡訊發送狀態的提示),儲存簡訊(可以用於簡訊列表顯示等等),簡訊的儲存可以用SQLite,不過覺得也就幾十條上百條簡訊,用SQLite未免大材小用,還麻煩,於是決定用SharePreference結合對象序列化來做這個模組。
首先是簡訊實體類,為了複用,做成抽象類別,再具體項目中使用只要繼承該抽象類別即可:
public abstract class Message implements Serializable{private String number;//private int playTime;private int id;private String userName;private String messageText;private String time;public Message(String number, int playTime, int id, String userName,String messageText, String time) {super();this.number = number;//this.playTime = playTime;this.id = id;this.userName = userName;this.messageText = messageText;this.time = time;}public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getMessageText() {return messageText;}public void setMessageText(String messageText) {this.messageText = messageText;}public String getTime() {return time;}public void setTime(String time) {this.time = time;}@Overridepublic String toString() {// TODO Auto-generated method stubreturn "號碼:"+this.number+",使用者:"+this.userName+",編號:"+this.id+",簡訊內容:"+this.messageText;}}
擁有幾個簡訊必須的資料作為成員變數,然後重新toString方法。
核心操作類,MessageUtils,擁有傳送簡訊方法,包括髮送完後對簡訊的儲存,簡訊發送成功與否、接收成功與否狀態的反饋功能,對單條簡訊和全部簡訊擷取都有提供對外介面,使用的時候非常方便:
public class MessageUtils {//private Message message;private Context context;private String SENT_SMS_ACTION = "SENT_SMS_ACTION"; private String DELIVERED_SMS_ACTION = "DELIVERED_SMS_ACTION"; //攜帶發送是否成功狀態的Intentprivate Intent sentIntent; private PendingIntent sentPI; //攜帶接收是否成功狀態的Intentprivate Intent deliverIntent; private PendingIntent deliverPI; public MessageUtils(Context context) {super();this.context = context;sentIntent = new Intent(SENT_SMS_ACTION); deliverIntent = new Intent(DELIVERED_SMS_ACTION);}/** * 序列化對象 * @param message * @return * @throws IOException */private String serialize(Message message) throws IOException { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); ObjectOutputStream objectOutputStream = new ObjectOutputStream( byteArrayOutputStream); objectOutputStream.writeObject(message); String serStr = byteArrayOutputStream.toString("ISO-8859-1"); serStr = java.net.URLEncoder.encode(serStr, "UTF-8"); objectOutputStream.close(); byteArrayOutputStream.close(); return serStr; } /** * 還原序列化對象 * * @param str 將要轉化為對象的字串 * @return * @throws IOException * @throws ClassNotFoundException */ private Message deSerialization(String str) throws IOException, ClassNotFoundException { if(str == null || str == ""){ return null; } String redStr = java.net.URLDecoder.decode(str, "UTF-8"); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( redStr.getBytes("ISO-8859-1")); ObjectInputStream objectInputStream = new ObjectInputStream( byteArrayInputStream); Message message = (Message) objectInputStream.readObject(); objectInputStream.close(); byteArrayInputStream.close(); return message; } /** * 儲存簡訊 * @param strObject 序列化後轉化為String的簡訊對象 * @param num 簡訊儲存的序號 */ private void saveMessage(Message message,int num) { String strObject;try {String i = String.valueOf(num);strObject = serialize(message);SharedPreferences sp = context.getSharedPreferences("Message", 0); Editor edit = sp.edit(); edit.putString(i, strObject); edit.commit(); //重設簡訊總條數 setSmsCount(num);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} } /** * 刪除某條簡訊 * @param num 被刪除簡訊的儲存序號 */ public void deleteMessage(int num) { int sum = getSmsCount(); if(sum == num){ setSmsCount(--sum); return; } for(int i = num;i < sum;i++ ){ Message message = getMessage(i+1); saveMessage(message, i); } // int count = getSmsCount();// setSmsCount(--count);} /** * 獲得某條簡訊 * @param num 簡訊儲存的序號 * @return */ public Message getMessage(int num) { SharedPreferences sp = context.getSharedPreferences("Message", 0); Message message; String i = String.valueOf(num);try {message = deSerialization(sp.getString(i, null));return message; } catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();return null;} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();return null;} } /** * 獲得全部儲存的簡訊 * @return */ public List<Message> getAllMessage() {List<Message> messages = new ArrayList<Message>();for(int i = 1;i <= getSmsCount();i++){Message message = getMessage(i);messages.add(message);} return messages;} /** * 傳送簡訊,註冊發送狀態廣播和接收狀態廣播,每發送一條簡訊就將其儲存起來 * @param messageText 簡訊內容 * @param num 對方號碼 */ public void sendMessage(Message message){ SmsManager smsManager = SmsManager.getDefault(); sentPI = PendingIntent.getBroadcast(context, 0, sentIntent, 0); deliverPI = PendingIntent.getBroadcast(context, 0, deliverIntent, 0); regSendBroadcast(); regRecBroadcast(); List<String> divideContents = smsManager.divideMessage(message.getMessageText()); for (String text : divideContents) { smsManager.sendTextMessage(message.getNumber(), null, text, sentPI, deliverPI); } int count = getSmsCount(); //每發送一條簡訊就將其儲存 saveMessage(message, ++count); } /** * 註冊發送狀態廣播,等待電訊廠商返回結果碼,根據結果碼作出相應的反應 */ private void regSendBroadcast(){ context.registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context _context, Intent _intent) { switch (getResultCode()) { case Activity.RESULT_OK: Toast.makeText(context, "簡訊發送成功", Toast.LENGTH_SHORT) .show(); break; case SmsManager.RESULT_ERROR_GENERIC_FAILURE: Toast.makeText(context, "簡訊發送失敗", Toast.LENGTH_SHORT) .show(); break; case SmsManager.RESULT_ERROR_RADIO_OFF: Toast.makeText(context, "簡訊發送失敗", Toast.LENGTH_SHORT) .show(); break; case SmsManager.RESULT_ERROR_NULL_PDU: Toast.makeText(context, "簡訊發送失敗", Toast.LENGTH_SHORT) .show(); break; } } }, new IntentFilter(SENT_SMS_ACTION)); } /** * 註冊簡訊接收狀態廣播,一旦接收方成功收到簡訊則收到廣播 */ private void regRecBroadcast(){ context.registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context _context, Intent _intent) { Toast.makeText(context, "收信人已經成功接收", Toast.LENGTH_SHORT) .show(); } }, new IntentFilter(DELIVERED_SMS_ACTION)); } /** * 設定簡訊條數記錄 * @param count */ private void setSmsCount(int count) { SharedPreferences sp = context.getSharedPreferences("Message", 0); Editor edit = sp.edit(); edit.putInt("smsCount", count); edit.commit(); } /** * 獲得儲存簡訊總條數 * @return */ public int getSmsCount() { SharedPreferences sp = context.getSharedPreferences("Message", 0); int count = sp.getInt("smsCount", 0); return count;} }使用對象的序列化和還原序列化,將一個Message對象轉化為String對象,將其儲存在SharePreference中,鍵值為簡訊的序號。通過該序號就可以查詢或刪除指定簡訊。
這樣單項目需要簡訊操作並需要儲存簡訊時,可以使用這個小模組,只需要一個MessageUtils對象,調用它的public方法既能方便操作簡訊,符合物件導向高彙總低耦合,可複用的設計原則。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
安卓開發之簡單的簡訊操作模組