天天看点

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怎么弄这个就很简单了,本文也不在赘述。

继续阅读