現在好多手機都自帶定時發短信,但是感覺定時發送這個功能裡面有結合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怎麼弄這個就很簡單了,本文也不在贅述。