AlarmManager介绍与实践

简介:
利用AlarmManager可以访问系统级别的闹钟服务(更通俗的说是定时服务),比如你可以设置在未来的某个启动应用。当一个Alarm运行时,其对应的Intent将会自动注册为broadcast。当设备处在休眠状态时,该Alarm可以唤醒CPU,并执行。但是设备一旦重启,该Alarm会被清除。
当Alarm在运行时(该Alarm对应的broadcast的onReceive()在执行中),该Alarm会持有CPU的唤醒锁,执行完毕之后将自动释放该锁。这就保证了一旦Alarm开始运行,那么一定会在CPU休眠之前运行结束。但是如果你在广播接受者中使用Context.startService()来启动相关服务,那么很可能在该Service启动之前,CPU就进入了休眠状态,从而导致Service不能被响应。
API 19之后,为了减少CPU的唤醒和减少耗电,Google对Alarm做了调整,这就使得Alarm的执行不保证完全精确,可能存在一些时间上的误差。如果你对时间的精确度要求比较严格,那么你可以使用新API:setWindow(int,long,long,PendingIntent)和setExact(int,long,PendingIntent)
AlarmManager常用的方法有3个:

  1. set(int type,long startTime,PendingIntent pi):用于设置一次性闹钟
  2. setRepeating(int type,long startTime,long intervalTime,PendingIntent pi):用于设置周期性闹钟
  3. setInexactRepeating(int type,long startTime,long intervalTime,Pendding pi):和第二个方法类似,不过这两个闹钟执行的间隔不是固定的。

方法参数解释:
int type:代表闹钟的类型。常用的有以下:

  1. AlarmManager.ELAPSED_REALTIME:不能唤醒cpu,休眠状态下不可用。采用相对时间(自设备启动时起,包括休眠的时间)
  2. AlarmManager.ELAPSED_REALTIME_WAKEUP:能唤醒cpu,休眠状态下可用。采用相对时间。
  3. AlarmManager.RTC:不能唤醒cpu,休眠状态下不可用。采用绝对时间(也就是当前系统时间)
  4. AlarmManager.RTC_WAKEUP:能唤醒cpu,休眠状态下可用。采用绝对时间。

PendingIntent pi :绑定闹钟的执行动作。要注意如果要启动服务,则使用PendingIntent.getService(Context c,int i,Intent intent,int j);如果启动广播,则使用PendingIntent.getBroadcast(Context c,int i,Intent intent ,int j);如果启动Activity,则使用PendingIntent.getActivity(Context c,int i,Intent intent ,int j)。

简单使用:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent  intent =new Intent(MainActivity.this, NoticeActivity.class);
        //AlarmManager的使用
        PendingIntent pendingIntent=PendingIntent.getActivity(MainActivity.this, 0, intent, 0);
        AlarmManager am = (AlarmManager) getSystemService(Service.ALARM_SERVICE);
        long timeMillis = System.currentTimeMillis();
        am.set(AlarmManager.RTC_WAKEUP, timeMillis+1000*10, pendingIntent);
    }

深入:

你可能感兴趣的:(闹钟,轮询,定时服务,AlarmManag)