安卓開發之簡單的簡訊操作模組

來源:互聯網
上載者:User

標籤: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方法既能方便操作簡訊,符合物件導向高彙總低耦合,可複用的設計原則。

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

安卓開發之簡單的簡訊操作模組

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.