Android定时发送短信功能实现

来源:互联网 发布:淘宝代购衣服专柜真假 编辑:程序博客网 时间:2024/05/07 00:07

现在好多手机都自带定时发短信,但是感觉定时发送这个功能里面有结合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);
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,参考这篇文章,本文不细说了。有了以上的几个部分,一整合基本就可以实现闹钟的功能了,至于BroadcastReceiver怎么弄这个就很简单了,本文也不在赘述。
原创粉丝点击