欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

一个简单的Android定时任务

程序员文章站 2023-11-29 19:29:16
使用alarmmanager来实现定时提醒,它提供了一种访问系统闹钟服务的方式。在全局中,达到设定的时间, 在它上面注册的一个intent将会被广播,接着启动相应的应用...

使用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);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。