定时发送短信之AlarmManage,SmsManger的使用

来源:互联网 发布:手机吓人软件大全 编辑:程序博客网 时间:2024/05/16 02:39

学习定时发送短息,结果了看了好几个帖子,都介绍的好简单,自己照着弄了下,总是不成功,后来终于找到原因了。还是AlarmManage的使用有问题。。

首先获取一个闹铃管理对象

AlarmManager alarm=(AlarmManager) getSystemService(ALARM_SERVICE);

之后介绍他的方法

❑ void set(int type, long triggerAtTime, PendingIntent operation)
设置一个闹钟

❑ void setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)
设置一个会重复的闹钟

❑ void setInexactRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)
设置一个重复闹钟的不精确版本,它相对而言更节能(power-efficient)一些,因为系统可能会将几个差不多的闹钟合并为一个来执行,减少设备的唤醒次数。
内置的几个interval为:
INTERVAL_FIFTEEN_MINUTES
INTERVAL_HALF_HOUR
INTERVAL_HOUR
INTERVAL_HALF_DAY
INTERVAL_DAY
如果你将其设为DAY,那么可能这一天中的所有闹钟都会被合并掉。

❑ void cancel(PendingIntent operation)
取消一个设置的闹钟

❑ void setTimeZone(String timeZone)
设置系统的默认时区。需要android.permission.SET_TIME_ZONE权限

======

下边来介绍方法里的参数

❑ ELAPSED_REALTIME
在指定的延时过后,发送广播,但不唤醒设备。

❑ ELAPSED_REALTIME_WAKEUP
在指定的延迟后,发送广播,并唤醒设备
该闹铃所用的时间是相对时间,是从系统启动后开始计时的,包括睡眠时间,可以通过调用SystemClock.elapsedRealtime()获得


❑ RTC
在指定的时刻,发送广播,但不唤醒设备

❑ RTC_WAKEUP
在指定的时刻,发送广播,并唤醒设备

该闹铃所用的时间是绝对时间,所用时间是UTC时间,可以通过调用 System.currentTimeMillis()获得

简单举例如下:5秒钟后发送一条广播

AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);   Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class);   int requestCode = 0;   PendingIntent pendIntent = PendingIntent.getBroadcast(getApplicationContext(),           requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);   // 5秒后发送广播,只发送一次  我们用的时间都是long类型的毫秒值 int triggerAtTime = SystemClock.elapsedRealtime() + 5 * 1000;   alarmMgr.set(AlarmManager.ELAPSED_REALTIME, triggerAtTime, pendIntent);  
如果是重复发送的,修改最后一行代码如下,5秒后发送一条广播,之后每隔10秒再发送一次。。
//alarmMgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, 10*1000, pendIntent); 
取消闹铃的话执行如下操作:
alarmMgr.cancel(pendIntent);
// 与上面的intent匹配(filterEquals(intent))的闹钟会被取消   

上边的看懂了的话,实现自动发送短信就简单那了,首先记得清单文件里添加发送短信的权限SEND_SMS,之后就是接收到广播以后将短信发送出去。

下边两句可以将短信发送出去,num为号码,s为短信内容。。。sendintent就是PendingIntent可以省略写为null,额外说明下,安卓发送短信是有字数限制的,带中文的只能发送70个,英文是160个,所以短信字数超标后得做处理。SmsManager有个方法可以分割短信的,至于如何区分中英文,没研究过,默认都做中文处理,以后有空再研究这个,或者哪个大师知道的话回帖告诉我下,谢了先。

SmsManager manger = SmsManager.getDefault();

manger.sendTextMessage(num, null, s, sendintent, null);

====本人写的小程序定时的获取过程。。

首先通过对话框获取用户选择的时间,比如

riqi="2013-8-2 :15:30:000";

SimpleDateFormat  format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

alarmManger.set(AlarmManager.RTC,format.parse(riqi).getTime(), operation);//operation为Pendingintent的一个实例

其他一些时间的获取处理,感觉会处理时间就简单多了

//设定一个五秒后的时间    Calendar calendar=Calendar.getInstance();    calendar.setTimeInMillis(System.currentTimeMillis());    calendar.add(Calendar.SECOND, 5);        AlarmManager alarm=(AlarmManager)getSystemService(ALARM_SERVICE);    alarm.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);    //或者以下面方式简化    //alarm.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+5*1000, sender);


 

 

PendingIntent额外知识:除了可以获取广播外,还能获得activity,service。

开发者可以通过调用getActivity(Context, int, Intent, int)

getBroadcast(Context, int, Intent, int)

getService(Context, int, Intent, int)

三种不同方式来得到一个PendingIntent实例。

其中:getActivity——通过该函数获得的PendingIntent可以直接启动新的activity, 就像调用 Context.startActivity(Intent)一样.不过值得注意的是要想这个新的Activity不再是当前进程存在的Activity 时。我们在intent中必须使用Intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

 

======

Android中的Alarm在设备处于睡眠模式时仍保持活跃,它可以设置来唤醒设备;然而,所有的Alarm在设备重启时都会被取消

为了创建一个新的Alarm,使用set方法并指定一个Alarm类型、触发时间和在Alarm触发时要调用的Intent。如果你设定的Alarm发生在过去,那么,它将立即触发。

原创粉丝点击