Android闹钟 AlarmManager的使用

Android闹钟 AlarmManager的使用

AlarmManager介绍

  AlarmManager这个类提供对系统闹钟服务的访问接口。

  你可以为你的应用设定一个在未来某个时间唤醒的功能。

  当闹钟响起,实际上是系统发出了为这个闹钟注册的广播,会自动开启目标应用。

  注册的闹钟在设备睡眠的时候仍然会保留,可以选择性地设置是否唤醒设备,但是当设备关机和重启后,闹钟将会被清除

  在alarm的receiver的onReceive()方法被执行的时候,Alarm Manager持有一个CPU唤醒锁,这样就保证了设备在处理完广播之前不会sleep。

  一旦onReceive()方法返回,Alarm Manager就会释放这个锁,表明一些情况下可能onReceive()方法一执行完设备就会sleep。

  如果你的alarm receiver中调用了Context.startService(),那么很可能service还没起来设备就sleep了。

  为了阻止这种情况,你的BroadcastReceiver和Service需要实现不同的唤醒锁机制,来确保设备持续运行到service可用为止。

  注意:Alarm Manager主要是用来在特定时刻运行你的代码,即便是你的应用在那个特定时刻没有跑的情况。

  对于常规的计时操作(ticks, timeouts, etc),使用Handler处理更加方便和有效率。

  另:从API 19开始,alarm的机制都是非准确传递,操作系统将会转换闹钟,来最小化唤醒和电池使用。

  有一些新的API会支持严格准确的传递,见 setWindow(int, long, long, PendingIntent)setExact(int, long, PendingIntent)

  targetSdkVersion在API 19之前应用仍将继续使用以前的行为,所有的闹钟在要求准确传递的情况下都会准确传递。

闹钟Demo

  Android Api demos中就有关于闹钟使用的Demo:

  com.example.android.apis.app.AlarmController

  其中设定了两种闹钟,一种是一次性的,一种是重复的。

Manifest中的声明,process属性

  自定义的receiver,在manifest中声明如下:

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

  Demo中两个Receiver的onReceive方法中显示了各自的Toast提示,所以不再列出。

  在此讨论一下process属性,它规定了组件(activity, service, receiver等)所在的进程。

  通常情况下,没有指定这个属性,一个应用所有的组件都运行在应用的默认进程中,进程的名字和应用的包名一致。

  比如manifest的package="com.example.helloalarm",则默认进程名就是com.example.helloalarm。

  <application>元素的process属性可以为全部的组件设置一个不同的默认进程。

  组件可以override这个默认的进程设置,这样你的应用就可以是多进程的。

  如果你的process属性以一个冒号开头,进程名会在原来的进程名之后附加冒号之后的字符串作为新的进程名。当组件需要时,会自动创建这个进程。这个进程是应用私有的进程。

  如果process属性以小写字母开头,将会直接以属性中的这个名字作为进程名,这是一个全局进程,这样的进程可以被多个不同应用中的组件共享。

一次性闹钟

            // When the alarm goes off, we want to broadcast an Intent to our
            // BroadcastReceiver. Here we make an Intent with an explicit class
            // name to have our own receiver (which has been published in
            // AndroidManifest.xml) instantiated and called, and then create an
            // IntentSender to have the intent executed as a broadcast.
            Intent intent = new Intent(AlarmController.this, OneShotAlarm.class);
            PendingIntent sender = PendingIntent.getBroadcast(
                    AlarmController.this, 0, intent, 0);

            // We want the alarm to go off 10 seconds from now.
            Calendar calendar = Calendar.getInstance();
            calendar.setTimeInMillis(System.currentTimeMillis());
            calendar.add(Calendar.SECOND, 10);

            // Schedule the alarm!
            AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
            am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);

重复闹钟

  闹钟设置:

            // When the alarm goes off, we want to broadcast an Intent to our
            // BroadcastReceiver. Here we make an Intent with an explicit class
            // name to have our own receiver (which has been published in
            // AndroidManifest.xml) instantiated and called, and then create an
            // IntentSender to have the intent executed as a broadcast.
            // Note that unlike above, this IntentSender is configured to
            // allow itself to be sent multiple times.
            Intent intent = new Intent(AlarmController.this,
                    RepeatingAlarm.class);
            PendingIntent sender = PendingIntent.getBroadcast(
                    AlarmController.this, 0, intent, 0);

            // We want the alarm to go off 10 seconds from now.
            Calendar calendar = Calendar.getInstance();
            calendar.setTimeInMillis(System.currentTimeMillis());
            calendar.add(Calendar.SECOND, 10);
            // Schedule the alarm!
            AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
            am.setRepeating(AlarmManager.RTC_WAKEUP,
                    calendar.getTimeInMillis(), 10 * 1000, sender);

  闹钟取消:

            // Create the same intent, and thus a matching IntentSender, for
            // the one that was scheduled.
            Intent intent = new Intent(AlarmController.this,
                    RepeatingAlarm.class);
            PendingIntent sender = PendingIntent.getBroadcast(
                    AlarmController.this, 0, intent, 0);

            // And cancel the alarm.
            AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
            am.cancel(sender);

AlarmManager说明

  AlarmManager这个类提供对系统闹钟服务的访问接口。

  对它的获取是通过系统服务:

  Context.getSystemService(Context.ALARM_SERVICE)

  相关方法说明:

  cancel(PendingIntent operation)方法将会取消Intent匹配的任何闹钟。

  关于Intent的匹配,查看filterEquals(Intent other)方法的说明可知,两个Intent从intent resolution(filtering)(Intent决议或过滤)的角度来看是一致的,即认为两个Intent相等。即是说,Intent的action,data,type,class,categories是相同的,其他的数据都不在比较范围之内。

  set(int type, long triggerAtMillis, PendingIntent operation)方法将会设置一个闹钟。

  注意:对于计时操作,可能使用Handler更加有效率和简单。

  设置闹钟的时候注意:

  1.如果声明的triggerAtMillis是一个过去的时间,闹钟将会立即被触发。

  2.如果已经有一个相同intent的闹钟被设置过了,那么前一个闹钟将会取消,被新设置的闹钟所代替。

  注意这里说的intent相同指的都是Intent在 filterEquals(Intent)的定义下匹配。

  闹钟是一个广播,接收器需要自己定义和注册,注册使用动态注册( registerReceiver(BroadcastReceiver, IntentFilter) )或者静态注册(<receiver> tag in an AndroidManifest.xml file)都可以。

  setRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation)方法将会设置一个重复性的闹钟。

  比set方法多了一个间隔参数。

  type的类型是四种:

  ELAPSED_REALTIMEELAPSED_REALTIME_WAKEUPRTCRTC_WAKEUP.

  区分的是时间标准和是否在睡眠状态下唤醒设备。

  具体查看官方文档吧不再详细解释啦。

实例

  比如要设置一个每晚21:30唤醒的重复闹钟:

    private static final int INTERVAL = 1000 * 60 * 60 * 24;// 24h

//...

        Intent intent = new Intent(context, RequestAlarmReceiver.class);
        PendingIntent sender = PendingIntent.getBroadcast(context,
                REQUEST_CODE, intent, PendingIntent.FLAG_CANCEL_CURRENT);

        // Schedule the alarm!
        AlarmManager am = (AlarmManager) context
                .getSystemService(Context.ALARM_SERVICE);

        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 21);
        calendar.set(Calendar.MINUTE, 30);
        calendar.set(Calendar.SECOND, 10);
        calendar.set(Calendar.MILLISECOND, 0);

        am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                INTERVAL, sender);

参考资料

  AlarmManager:

  http://developer.android.com/reference/android/app/AlarmManager.html

  闹钟Demo解析:

  http://blog.csdn.net/mapdigit/article/details/7644134

Android闹钟 AlarmManager的使用,布布扣,bubuko.com

时间: 2024-10-09 22:29:06

Android闹钟 AlarmManager的使用的相关文章

Android闹钟设置的解决方案

Android设置闹钟并不像IOS那样这么简单,做过Android设置闹钟的开发者都知道里面的坑有多深.下面记录一下,我解决Android闹钟设置的解决方案. 主要问题 API19开始AlarmManager的机制修改. 应用程序被Kill掉后,设置的闹钟不响. 6.0以上进入Doze模式会使JobScheduler停止工作. 手机设置重启后,闹钟失效问题. API19以上AlarmManager机制的修改 API19之前AlarmManager提供了三个设置闹钟的方法,由于业务需求闹钟只需要一

我的Android进阶之旅------&gt;Android使用AlarmManager全局定时器实现定时更换壁纸

该DEMO将会通过AlarmManager来周期的调用ChangeService,从而让系统实现定时更换壁纸的功能. 更换壁纸的API为android.app.WallpaperManager,它提供了clear()方法来清除壁纸,还提供了如下方法来设置壁纸. setResource(int resid)将壁纸设置为resid资源所代表的图片 setBitmap(Bitmap bitmap)将壁纸设置为bitmap所代表的位图 setStream(InputStream data)将壁纸设置为d

Android中AlarmManager使用示例(持续更新)

现在普遍的手机都会有一个闹钟的功能,如果使用Android来实现一个闹钟可以使用AtarmManager来实现.AtarmManager提供了一种系统级的提示服务,允许你安排在将来的某个时间执行一个服务.AlarmManager对象一般不直接实例化,而是通过Context.getsystemservice(Context.ALARM_SERVICE)方法获得. 下面是我们运用之前用到的TimePickerDialog结合AlarmManager,实现一个可以设定任意时间而且可以重复的闹钟,演示效

android闹钟小案例之知识点总结

上一篇文章对近期做的小闹钟做了功能阐述,现在来总结下整个开发过程中所用到的一些知识点: 1.TimePicker的监听 TimePicker控件是整个应用的核心,其它的操作都得基于对该控件的正确操控.对该控件的操作重要就是为其设置监听器,在监听事件中获取用户设置的时间. private Calendar calendar=Calendar.getInstance();//创建calendar对象 private class OnTimeChangedListenerImpl implements

Android闹钟【复杂版】

最近做闹钟,所以自己写了个Demo版本,这个程序是用listview单独的类来实现的,和activity类分开来实现的!这个是用数据库进行更新的,当闹钟设置后,闹钟图片变成闹钟的样子,闹钟取消后,图片变成灰色的闹钟,这个是用ListView来实现数据库更新数据的!然后弹对话框来实现时间的设置和周几重复的功能,这个功能能实现,我测试了!正确无误!需要注意的地方有两个:listview每次滑动的时候,记得设置背景为透明,mAlarmListView.setCacheColorHint(0);另一个是

android闹钟(五):实现闹钟功能

闹钟主页面:AlarmView.java package com.mytest.myclock; import java.util.Calendar; import android.app.AlarmManager; import android.app.AlertDialog; import android.app.PendingIntent; import android.app.TimePickerDialog; import android.content.Context; import

android闹钟小案例之功能阐述

最近花了一个星期左右的时间做了一个小闹钟,现在回过头来进行总结下.刚开始接触这个案例,总体觉着没有太大的难度,都是一些基础知识的堆砌,可现实总比理想残酷啊,这几天下来,每天都会有意料之外的bug出现.在debug的过程中,深深体会到了百度一下和谷歌谷歌的用处,基本常见的问题都可以在这里得到提示甚至答案.这篇文章先来介绍下这个案例所实现的功能,接下来再用几遍文章记录所用到的知识点. 功能简介: 1.闹钟基本功能:和平时的闹钟一样,用户在界面选择闹钟响起的时间,到达所设定时间后执行相应的指定操作.

Android闹钟程序

原文:Android闹钟程序 源代码下载地址:http://www.zuidaima.com/share/1597010528603136.htm 转自csdn: 版权声明:本文为博主原创文章,未经博主允许不得转载.

Android之AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作

AlarmManager的使用机制有的称呼为全局定时器,有的称呼为闹钟.通过对它的使用,个人觉得叫全局定时器比较合适,其实它的作用和Timer有点相似.都有两种相似的用法:(1)在指定时长后执行某项操作(2)周期性的执行某项操作 AlarmManager对象配合Intent使用,可以定时的开启一个Activity,发送一个BroadCast,或者开启一个Service. 下面的代码详细的介绍了两种定时方式的使用: (1)在指定时长后执行某项操作 //操作:发送一个广播,广播接收后Toast提示定