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

Android通过AlarmManager类实现简单闹钟功能

程序员文章站 2023-01-07 13:31:34
android通过alarmmanager类实现闹钟,供大家参考,具体内容如下 简介 闹钟是生活中最常用的功能了,很多app都可以加入该功能,提醒用户某个时刻要做的事情...

android通过alarmmanager类实现闹钟,供大家参考,具体内容如下

简介

闹钟是生活中最常用的功能了,很多app都可以加入该功能,提醒用户某个时刻要做的事情。在android系统中可以通过alarmmanager类实现闹钟,alarmmanager类是专门用来设定在某个指定的时间去完成指定的事件。alarmmanager提供了访问系统警报的服务,只要在程序中设置了警报服务,alarmmanager就会通过onreceive()方法去还行这些事件,就算系统处于待机状态,同样不会影响运行。可以通过context.getsystemservice方法来获取该服务。接下来我们将使用alarmmanager来制作一个最简单的闹钟。

让我们来看一下alarmmanager都为我们提供了哪些方法,如下:

Android通过AlarmManager类实现简单闹钟功能

要实现闹钟,首先需要创建一个继承自broadcastreceiver的类,实现onreceive方法来接收这个alarm服务,然后通过建立intent和pendingintent连接来调用alarm组件,并通过timepickerdialog来设置时间,当时间到我们指定的时间后onreceive方法接收到alarm服务后即可进行提示。   

让我们实现主界面布局,效果如下:

Android通过AlarmManager类实现简单闹钟功能

接下来让我们实现接收alarm服务的alarmreceiver类,该类比较简单,在收到消息后用一个toast来提示用户,具体实现代码如下:

public class alarmreceiver extends broadcastreceiver {

 @override
 public void onreceive(context context, intent intent) {
  toast.maketext(context, "您设置的时间到了!",
   toast.length_short).show();
 }
}

由于使用了broadcastreceiver,因此我们需要在androidmanifest.xml文件中对其进行声明,如下:

<receiver android:name=".alarmreceiver" android:process=":remote" />

接下来,在mainactivity中我们实现“设置闹钟”和“取消闹钟”的事件监听,让我们来看一下具体实现代码:

public class mainactivity extends activity {
 private button btnset, btncancel;
 private textview info;
 private calendar calendar;

 @override
 protected void oncreate(bundle savedinstancestate) {
  super.oncreate(savedinstancestate);
  setcontentview(r.layout.activity_main);
  btnset = (button) findviewbyid(r.id.setalarm);
  btncancel = (button) findviewbyid(r.id.cancelalarm);
  info = (textview) findviewbyid(r.id.info);

  calendar = calendar.getinstance();

  btnset.setonclicklistener(new onclicklistener() {
   @override
   public void onclick(view v) {
    // todo auto-generated method stub
    calendar.settimeinmillis(system.currenttimemillis());
    int mhour = calendar.get(calendar.hour_of_day);
    int mminute = calendar.get(calendar.minute);
    new timepickerdialog(mainactivity.this,
      new timepickerdialog.ontimesetlistener() {
       @override
       public void ontimeset(timepicker view,
         int hourofday, int minute) {
        // todo auto-generated method stub
        calendar.settimeinmillis(system.currenttimemillis());
        calendar.set(calendar.hour_of_day, hourofday);
        calendar.set(calendar.minute, minute);
        calendar.set(calendar.second, 0);
        calendar.set(calendar.millisecond, 0);
        // 建立intent和pendingintent来调用目标组件
        intent intent = new intent(mainactivity.this, alarmreceiver.class);
        pendingintent pendingintent = pendingintent.getbroadcast(mainactivity.this, 0, intent, 0);
        // 获取闹钟管理的实例
        alarmmanager am = (alarmmanager) getsystemservice(alarm_service);
        // 设置闹钟
        am.set(alarmmanager.rtc_wakeup, calendar.gettimeinmillis(), pendingintent);
        // 设置周期闹钟
        am.setrepeating(alarmmanager.rtc_wakeup,
          system.currenttimemillis() + (10 * 1000),
          (24 * 60 * 60 * 1000), pendingintent);
        string tmps = "设置闹钟时间为" + format(hourofday)
          + ":" + format(minute);
        info.settext(tmps);
       }
      }, mhour, mminute, true).show();
   }
  });

  btncancel.setonclicklistener(new onclicklistener() {
   @override
   public void onclick(view v) {
    // todo auto-generated method stub
    intent intent = new intent(mainactivity.this,
      alarmreceiver.class);
    pendingintent pendingintent = pendingintent.getbroadcast(
      mainactivity.this, 0, intent, 0);
    // 获取闹钟管理实例
    alarmmanager am = (alarmmanager) getsystemservice(alarm_service);
    // 取消
    am.cancel(pendingintent);
    info.settext("闹钟已经取消");
   }
  });
 }

 // 格式化字符串7:3-->07:03
 private string format(int x) {
  string s = "" + x;
  if (s.length() == 1) {
   s = "0" + s;
  }
  return s;
 }

 @override
 public boolean oncreateoptionsmenu(menu menu) {
  // inflate the menu; this adds items to the action bar if it is present.
  getmenuinflater().inflate(r.menu.activity_main, menu);
  return true;
 }

}

在上述代码中我们使用了pendingintent,pendingintent这个类用于处理即将发生的事情,pendingintent可以看作是对intent的包装,通常通过getactivity、getbroadcast、getservice来得到pendingintent的实例,当前activity并不能马上启动它所包含的intent,而是在外部执行pendingintent时,调用intent。正是由于pendingintent中保存有当前app的context,使它赋予外部app一种能力,使得外部app可以如同当前app一样的执行pendingintent里的intent,就算在执行时当前app已经不存在了,也能通过保存在pendingintent里的context照样执行intent,另外还可以处理intent执行后的操作。常和alarmmanager和notificationmanager一起使用。

至此,一个简单的功能就实现了。

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