现在好多手机都自带定时发短信,但是感觉定时发送这个功能里面有结合alarm和广播两部分内容,所以小小记录一下。
首先,定时发短信无非就是“定时”和“发短信”两部分,那么分开来看。
很简单,定时发短信肯定不是到时间了再弹出短信编辑界面,所以那种方法就不说了,在此只记录直接发方法。
SmsManager manager = SmsManager.getDefault();
List 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怎么弄这个就很简单了,本文也不在赘述。