Android通过AlarmManager类实现简单闹钟功能
android通过alarmmanager类实现闹钟,供大家参考,具体内容如下
简介
闹钟是生活中最常用的功能了,很多app都可以加入该功能,提醒用户某个时刻要做的事情。在android系统中可以通过alarmmanager类实现闹钟,alarmmanager类是专门用来设定在某个指定的时间去完成指定的事件。alarmmanager提供了访问系统警报的服务,只要在程序中设置了警报服务,alarmmanager就会通过onreceive()方法去还行这些事件,就算系统处于待机状态,同样不会影响运行。可以通过context.getsystemservice方法来获取该服务。接下来我们将使用alarmmanager来制作一个最简单的闹钟。
让我们来看一下alarmmanager都为我们提供了哪些方法,如下:
要实现闹钟,首先需要创建一个继承自broadcastreceiver的类,实现onreceive方法来接收这个alarm服务,然后通过建立intent和pendingintent连接来调用alarm组件,并通过timepickerdialog来设置时间,当时间到我们指定的时间后onreceive方法接收到alarm服务后即可进行提示。
让我们实现主界面布局,效果如下:
接下来让我们实现接收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一起使用。
至此,一个简单的功能就实现了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。