天天看點

Android定時發送短信功能實作第一部分:發短信第二部分:定時

現在好多手機都自帶定時發短信,但是感覺定時發送這個功能裡面有結合alarm和廣播兩部分内容,是以小小記錄一下。

首先,定時發短信無非就是“定時”和“發短信”兩部分,那麼分開來看。

第一部分:發短信

很簡單,定時發短信肯定不是到時間了再彈出短信編輯界面,是以那種方法就不說了,在此隻記錄直接發方法。

SmsManager manager = SmsManager.getDefault();

List<String> divideContents = manager.divideMessage(content);

for (String text : divideContents) {

manager.sendTextMessage(tel, null, text, null, null);

}
           

核心得代碼隻有這幾行。divideMessage(String msg)方法主要是發短信是有字數限制的,這是用來divide你短信内容用的。最關鍵的是這個方法

sendTextMessage(tel, null, text, null, null)

一共5個參數,第一,三參數一看就知道,一個是手機号一個是發送的文本,第二個參數是短信中心服務号碼, 這裡設定為null (我也沒設過值,短信也可以正常發),最後兩個參數比較重要,PendingIntent類型,用來監聽短信是否發送成功和對方是否接收成功的,直接看代碼。

String SENT_SMS_ACTION = "SENT_SMS_ACTION";
String DELIVERED_SMS_ACTION = "DELIVERED_SMS_ACTION";

Intent sentIntent = new Intent(SENT_SMS_ACTION);
Intent deliverIntent = new Intent(DELIVERED_SMS_ACTION);

PendingIntent sentPI = PendingIntent.getBroadcast(context, 0, sentIntent, 0);
PendingIntent deliverPI = PendingIntent.getBroadcast(context, 0, deliverIntent, 0);

context.registerReceiver(sentBroadcast, new IntentFilter(SENT_SMS_ACTION));
context.registerReceiver(receiveSMS, new IntentFilter(DELIVERED_SMS_ACTION));
           

context就不說了,sentBroadcast和receiveSMS是兩個廣播(其實不說也能看出來。。),在這就可以做你想做的處理了。

private BroadcastReceiver sentBroadcast = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            switch (getResultCode()) {
                case Activity.RESULT_OK:
                    Utils.showToast(context, "短信發送成功");
                    break;
                case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                    Utils.showToast(context, "RESULT_ERROR_GENERIC_FAILURE");
                    break;
                case SmsManager.RESULT_ERROR_RADIO_OFF:
                    Utils.showToast(context, "RESULT_ERROR_RADIO_OFF");
                    break;
                case SmsManager.RESULT_ERROR_NULL_PDU:
                    Utils.showToast(context, "RESULT_ERROR_NULL_PDU");
                    break;
                case SmsManager.RESULT_ERROR_NO_SERVICE:
                    Utils.showToast(context, "RESULT_ERROR_NO_SERVICE");
                    break;
            }
        }
    };
    private BroadcastReceiver receiveSMS = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Utils.showToast(context, "收信人已經成功接收");
        }
    };
           

上面代碼很清楚了就不多說了。這部分就是發短信的部分。下面開始講“定時”部分。

第二部分:定時

最最關鍵的一行代碼

mAlarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), mTimedMessagePendingIntent);
           

挨個部分看下,mAlarmManager:在Android系統中,鬧鐘和喚醒功能都是由Alarm Manager Service(ALMS)控制并管理的。他本身是一個服務,是通過AlarmManager這個輔助類來跟我們程式打交道的,這個mAlarmManager就是AlarmManager的一個對象

mAlarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);                 = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);      

set方法作為設定一次性鬧鐘的方法其中的參數我們來挨個看一下。

第一個參數:一共有四個值,這四個值分為兩類,這兩類決定了第二個參數的寫法。

1)  RTC_WAKEUP 

2)  RTC 

3)  ELAPSED_REALTIME_WAKEUP 

4)  ELAPSED_REALTIME

帶RTC的兩個參數是以1970.1.1這個日期為基準,第二個參數的時間是以這個UTC時間為基準;

帶ELAPSED的兩個參數是以SystemClock.elapsedRealtime()這個時間為基準;

帶WAKEUP的兩個參數是在系統休眠的狀态下,仍可以喚醒系統而實作鬧鐘的功能。

第二個參數:需要配合第一個參數進行使用

第二個參數一定是在基準時間基礎之上你想設定讓它鬧鐘的時間。以RTC打個比方,你通過System.currentTimeMillis()這個方法得到了一個值,比如說是10000(就是打個比方。。)那麼這個時候你在第二個參數位置假設給70000,那麼就是說鬧鐘會在1分鐘之後生效(1分鐘60000毫秒)。知道第二個參數是什麼意思就好了,一般這個位置直接填你想讓它幾點響就行calendar.getTimeInMillis(),calendar就是你想讓他在幾年幾月幾日幾點幾分響的這個時間。

第三個參數:與廣播聯系起來的重要參數

第三個參數是一個PendingIntent

Intent intent = new Intent(this, AlarmBroadcastReceiver.class);
        intent.setAction("alarmBroadcastReceiverAction");
        intent.putExtra("content", content);
        intent.putExtra("telephone", telephone);
        PendingIntent mTimedMessagePendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);                PendingIntent mTimedMessagePendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);      

具體什麼是PendingIntent,參考這篇文章,本文不細說了。有了以上的幾個部分,一整合基本就可以實作鬧鐘的功能了,至于BroadcastReceiver怎麼弄這個就很簡單了,本文也不在贅述。

繼續閱讀