Android PendingIntent和AlarmManager启动定时任务

pendingintent使用的三种状况html

你能够经过getActivity(Context context, int requestCode, Intent intent, int flags)系列方法从系统取得一个用于启动一个Activity的PendingIntent对象,android

能够经过getService(Context context, int requestCode, Intent intent, int flags)方法从系统取得一个用于启动一个Service的PendingIntent对象app

能够经过getBroadcast(Context context, int requestCode, Intent intent, int flags)方法从系统取得一个用于向BroadcastReceiver的Intent广播的PendingIntent对象ui

 

pendingIntent的第4个参数.net

FLAG_CANCEL_CURRENT:若是当前系统中已经存在一个相同的PendingIntent对象,那么就将先将已有的PendingIntent取消,而后从新生成一个PendingIntent对象。htm

FLAG_NO_CREATE:若是当前系统中不存在相同的PendingIntent对象,系统将不会建立该PendingIntent对象而是直接返回null。对象

FLAG_ONE_SHOT:该PendingIntent只做用一次。在该PendingIntent对象经过send()方法触发事后,PendingIntent将自动调用cancel()进行销毁,那么若是你再调用send()方法的话,系统将会返回一个SendIntentException。blog

FLAG_UPDATE_CURRENT:若是系统中有一个和你描述的PendingIntent对等的PendingInent,那么系统将使用该PendingIntent对象,可是会使用新的Intent来更新以前PendingIntent中的Intent对象数据,例如更新Intent中的Extras。ci

 

AlarmManger启动定时任务,其经常使用的方法get

(1)set(int type,long startTime,PendingIntent pi);
        该方法用于设置一次性闹钟,第一个参数表示闹钟类型,第二个参数表示闹钟执行时间,第三个参数表示闹钟响应动做。
(2)setRepeating(int type,long startTime,long intervalTime,PendingIntent pi);

        该方法用于设置重复闹钟,第一个参数表示闹钟类型,第二个参数表示闹钟首次执行时间,第三个参数表示闹钟两次执行的间隔时间,第四个参数表示闹钟响应动做。相似JAVA的Timer里面scheduleAtFixedRate(TimerTask task, long delay, long period):以近似固定的时间间隔(由指定的周期分隔)进行后续执行。在固定速率执行中,根据已安排的初始执行时间来安排每次执行。若是因为任何缘由(如垃圾回收或其余后台活动)而延迟了某次执行,则将快速连续地出现两次或更多的执行,从而使后续执行可以“追遇上来”。从长远来看,执行的频率将正好是指定周期的倒数(假定 Object.wait(long) 所依靠的系统时钟是准确的)。

(3)setInexactRepeating(int type,long startTime,long intervalTime,PendingIntent pi);
        该方法也用于设置重复闹钟,与第二个方法类似,不过其两个闹钟执行的间隔时间不是固定的而已。它相对而言更节能(power-efficient)一些,由于系统可能会将几个差很少的闹钟合并为一个来执行,减小设备的唤醒次数。 有点相似JAVA的Timer里面schedule(TimerTask task, Date firstTime, long period):根据前一次执行的实际执行时间来安排每次执行。若是因为任何缘由(如垃圾回收或其余后台活动)而延迟了某次执行,则后续执行也将被延迟。在长期运行中,执行的频率通常要稍慢于指定周期的倒数(假定 Object.wait(long) 所依靠的系统时钟是准确的)。

(4)cancel(PendingIntent operation)
       取消一个设置的闹钟

(5)setTimeZone(String timeZone)
       设置系统的默认时区。须要android.permission.SET_TIME_ZONE权限

注解:使用alarmManager启动service时,用service的action(service在manifest中声明多个action)来启动,防止用service.class致使pendingintent相互覆盖影响的状况!重要!

 

小米2S中,setRepeating的intervalTime循环下次的周期,貌似最小是5分钟,网上有不少人遇到了这个问题!!坑爹!

参考资料

Android中如何作到Service被关闭后又自动启动