一个简单的Android定时任务
使用alarmmanager来实现定时提醒,它提供了一种访问系统闹钟服务的方式。在全局中,达到设定的时间,
在它上面注册的一个intent将会被广播,接着启动相应的应用程序,可以通过自定义receiver来实现。
首先要在androidmanifest.xml中进行注册
<receiver android:name=".alarmreceiver"> <intent-filter> <action android:name="clock" /> </intent-filter> </receiver>
自定义一个闹钟接收器,getintextra可用于接受发送方putextra传过来的值,intent i = new intent(“clock”)其中的“clock”是注册时使用的seceiver的name。
public class alarmreceiver extends broadcastreceiver { private int _id; private string str; @override public void onreceive(context context, intent intent) { _id = intent.getintextra("id", -1); intent i = new intent("clock"); i.setclass(context, noteeditor.class); i.putextra("id", _id); string str = intent.getstringextra("note"); toast.maketext( context, str, toast.length_short).show(); i.addflags(intent.flag_activity_new_task); context.startactivity(i); } }
时间的获取通过datepickerdialog和timepickerdialog,需要注意的是datepickerdialog的月份是从0开始。将获取的数据放在calendar类中,其中月份的存储也是从0开始。
final alarmmanager am = (alarmmanager) getsystemservice(alarm_service); calendar alarmcalendar = calendar.getinstance();
alarmcalendar.set(myear, mmonth-1, mday, mhour, mminute,0); intent i = new intent("clock"); i.setclass(this, alarmreceiver.class); i.putextra("id", _id); string note="notes"; i.putextra("note",note);
设置一个pendingintent对象作为闹钟响应的对象,发送广播。第二个参数可以为0,但是因为做的是一次性的闹钟,如果为0的话,新设的闹钟会将之前设的闹钟覆盖掉。flag_update_current: 如果希望获取的pendingintent对象与已经存在的pendingintent对象相比,如果只是intent附加的数据不同, 那么当前存在的pendingintent对象不会被取消,而是重新加载新的intent附加的数据。
pendingintent pi = pendingintent.getbroadcast(this, _id,i,pendingintent.flag_update_current);
发送闹钟请求,设置在alarmcalendar.gettimeinmillis()时间启动由pi指定的组件。
第一个参数用来指定定时服务的类型,主要可选以下值:
alarmmanager.elapsed_realtime:睡眠状态下不可用,该状态下闹钟使用相对时间。
alarmmanager.elapsed_realtime_wakeup:在睡眠状态下会唤醒系统并执行提示功能,也使用相对时间。
alarmmanager.rtc:该状态睡眠状态下不可用,使用绝对时间,即当前系统时间。
alarmmanager.rtc_wakeup:闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟也使用绝对时间。
am.set(alarmmanager.rtc_wakeup, alarmcalendar.gettimeinmillis(), pi);
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。