Android之AlarmManager学习

来源:互联网 发布:大数据列存储 编辑:程序博客网 时间:2024/05/17 18:48

参考http://www.cnblogs.com/zyw-205520/p/4040923.html(照搬过来的,不好意思了哈,作者,嘿嘿)

一、概述

生活就是一个不断的学习的过程,工作闲暇之余就喜欢弄一下没有接触过的东西,前几天同学给我说他要做一个类似闹钟的功能,而恰好我也没有弄过,所以就随便学习学习。

说说大致原理吧,感觉闹钟应该是一个定时提醒,它是通过获取一个闹钟管理器(AlarmManager),设置一个定时操作,然后通过一个意图(Intent)启动广播(BroadcastReceiver),然后在广播中做需要做的事。

二、学习过程

先熟悉一下AlarmManager的三个api
  1. set(int type, long triggerAtMillis, PendingIntent operation)
该方法用于设置一次性闹钟,第一个参数表示闹钟类型,第二个参数表示闹钟执行时间,第三个参数表示闹钟响应动作。
  1. setRepeating(int type, long triggerAtMillis,long intervalMillis, PendingIntent operation)
该方法用于设置重复闹钟,第一个参数表示闹钟类型,第二个参数表示闹钟首次执行时间,第三个参数表示闹钟两次执行的间隔时间,第三个参数表示闹钟响应动作。
  1. setInexactRepeating(int type, long triggerAtMillis,long intervalMillis, PendingIntent operation)
该方法也用于设置重复闹钟,与第二个方法相似,不过其两个闹钟执行的间隔时间不是固定的而已。
方法属性:

  • int type:闹钟的类型,常用的有4个值:AlarmManager.ELAPSED_REALTIME、AlarmManager.ELAPSED_REALTIME_WAKEUP、AlarmManager.RTC、AlarmManager.RTC_WAKEUP。
  1. AlarmManager.ELAPSED_REALTIME表示闹钟在手机睡眠状态下不可用,该状态下闹钟使用相对时间(相对于系统启动开始),状态值为3;
  2. AlarmManager.ELAPSED_REALTIME_WAKEUP表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟也使用相对时间,状态值为2;
  3. AlarmManager.RTC表示闹钟在睡眠状态下不可用,该状态下闹钟使用绝对时间,即当前系统时间,状态值为1;
  4. AlarmManager.RTC_WAKEUP表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟使用绝对时间,状态值为0;
  • long triggerAtMillis:闹钟的第一次执行时间,以毫秒为单位,可以自定义时间,不过一般使用当前时间。需要注意的是,本属性与第一个属性(type)密切相关,如果第一个参数对应的闹钟使用的是相对时间(ELAPSED_REALTIME和ELAPSED_REALTIME_WAKEUP),那么本属性就得使用相对时间(相对于系统启动时间来说),比如当前时间就表示为:SystemClock.elapsedRealtime();如果第一个参数对应的闹钟使用的是绝对时间(RTC、RTC_WAKEUP),那么本属性就得使用绝对时间,比如当前时间就表示为:System.currentTimeMillis()
  • long intervalMillis:对于后两个方法来说,存在本属性,表示两次闹钟执行的间隔时间,也是以毫秒为单位。
  • PendingIntent operation:是闹钟的执行动作,比如发送一个广播、给出提示等等。PendingIntent是Intent的封装类。需要注意的是,如果是通过启动服务来实现闹钟提示的话,PendingIntent对象的获取就应该采用Pending.getService(Context c,int i,Intent intent,int j)方法;如果是通过广播来实现闹钟提示的话,PendingIntent对象的获取就应该采用PendingIntent.getBroadcast(Context c,int i,Intent intent,int j)方法;如果是采用Activity的方式来实现闹钟提示的话,PendingIntent对象的获取就应该采用PendingIntent.getActivity(Context c,int i,Intent intent,int j)方法。如果这三种方法错用了的话,虽然不会报错,但是看不到闹钟提示效果。
AlarmManager类型如下:

  1. AlarmManager.RTC,硬件闹钟,不唤醒手机(也可能是其它设备)休眠;当手机休眠时不发射闹钟。
  2. AlarmManager.RTC_WAKEUP,硬件闹钟,当闹钟发射时唤醒手机休眠;
  3. AlarmManager.ELAPSED_REALTIME,真实时间流逝闹钟,不唤醒手机休眠;当手机休眠时不发射闹钟。
  4. AlarmManager.ELAPSED_REALTIME_WAKEUP,真实时间流逝闹钟,当闹钟发射时唤醒手机休眠;
首先需要一个你发送的广播
public class AlarmClockBroadcastReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        Log.i("TAG", "intent.getIntExtra==" + intent.getIntExtra("data", 0000000));    }}

其次需要获取闹钟管理类AlarmManager

AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

然后通过Intent启动BroadcastReceiver,设置启动的时间即可

    private void setReminder(boolean b, int data) {        Intent intent = new Intent("com.zrh528.alarmclock.AlarmClockBroadcastReceiver");        Bundle bundle = new Bundle();        bundle.putInt("data", data);        intent.putExtras(bundle);        PendingIntent pi = PendingIntent.getBroadcast(this, 101,intent, PendingIntent.FLAG_UPDATE_CURRENT);        if (b) {//            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,  System.currentTimeMillis() + 5000L,  2000L, pi);//            alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000L, pi);            alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000L, 2000L, pi);        } else {            alarmManager.cancel(pi);        }    }

不知为何上边的三个方法设置了重复的时间间隔但是没用,大概都是一分钟左右发送一次广播,不知什么原因,闹钟类型我也全部试过,还是一样的,而且有时是一分钟发送一次,有时不定时,但是大概也再一分钟左右(测试为手机小米note,系统android6.0.1)。



0 0
原创粉丝点击