Android 中 AlarmManager的使用

时间:2022-12-26 10:51:28

AlarmManager使用


最近项目中定时提醒的功能用到了AlarmManger,在这和大家分享一下:


1.AlarmManager这个类提供对系统闹钟服务的访问接口,是android中比较常用的系统级提示服务。

   使用闹钟服务,会在特定的时间为我们广播一个我们设定好的Intent,我们可以通过Intent执行startActivity,startService和senBroadcast。


在AlarmManager中我们使用的是PendingIntent,PendingIntent可以理解为Intent的代理类。


2.定义并设置一个广播


Intent intent = new Intent(this,DemoReceiver.class);

PendingIntent mPendingIntent = PendingIntent.getBroadcast(this,100,intent,Intent.FLAG_ACTIVITY_NEW_TASK));

AlarmManager mAlarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);  //获取AlarmManager对象

mAlarmManager.set(AlarmManager.RTC_WAKEUP, setMills, mPendingIntent);  //设置闹钟服务



3.AlarmManager中几个常用的方法:

(1)set(int type,long triggerAtTime, PendingIntent operation);

此方法用于设置一次性闹钟,type闹钟类型,triggerAtTime闹钟执行时间,operation就是我们定义的PendingIntent。

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


(2)setRepeating(int type,long triggerAtTime,long interval,PendingIntent operation);

用于设置可重复的闹钟,type闹钟类型,triggerAtTime闹钟首次执行的时间,interval重复闹钟的时间间隔,operation就是我们定义的PendingIntent。


(3)setInexactRepeating(int type,long triggerAtTime,long interval,PendingIntent operation);

  该方法也用于设置重复闹钟,和setRepeating方法相似,但是此方法中的闹钟间隔时间不是固定的。


(4)cancel(PendingIntent operation)取消闹钟设置,取消闹钟时PendingIntent中的Intent必须和设置闹钟时的Intent一致才行。


4.设置闹钟时的type参数的常用值,主要区分在睡眠状态唤醒和睡眠状态下不唤醒,相对时间和绝对时间

AlarmManager.ELAPSED_REALTIME 设置此种类型时闹钟在手机睡眠状态下不可用,此状态下闹钟会使用相对时间(相对于系统启动开始);

AlarmManager.ELAPSED_REALTIME_WAKEUP 这种类型的状态在手机睡眠状态下也会唤醒系统并执行指定功能,使用系那个对时间

 AlarmManager.RTC 表示闹钟在手机睡眠状态下不可用,该状态下闹钟使用绝对时间,即系统当前时间。

 Alarmmanager.RTC_WAKEUP 闹钟在睡眠状态下也会唤醒系统并执行指定功能,该状态下使用绝对时间。


 AlarmManager.POWER_OFF_WAKEUP 闹钟在手机关机状态下也能正常执行,使用的是绝对时间,但是在某些SDK版本中不支持(具体不详)。


5.long triggerAtTime参数

首次触发闹钟的时间,以毫秒为单位,此参数和4中的type类型有密不可分的关系,如果type对应的状态下使用的是绝对时间则此参数使用的就是绝对时间,ex:System.currentTimeMillis();

如果type对应的状态下使用的是相对时间,则此参数就是使用相对时间,ex:SystemClock.elapsedRealtime();



6.PendingIntent mPendingIntent 我们指定的操作,ex:发送广播,启动应用,开启服务。

  获取PendingIntent对象时要采用不同的方式获取:

  开启广播PendingIntent.getBroadcast(Context context, int requestCode,Intent intent, int flags)的方式获取,

  开启服务PendingIntent.getService(Context context, int requestCode,Intent intent, int flags)的方式获取,

  开启Activity PendingIntent.getActivity(Context context, int requestCode,Intent intent, int flags)的方式获取,




好了,废话差不多了,看代码:

public void setAlarm(){

  //在当天的18点钟启动闹钟发送广播

Calendar mSetCalendar = Calendar.getInstance();

mSetCalendar.set(Calendar.HOUR_OF_DAY, 18);

mSetCalendar.set(Calendar.MINUTE, 0);

mSetCalendar.set(Calendar.SECOND, 0);

mSetCalendar.set(Calendar.MILLISECOND, 0);


long setMills = mSetCalendar.getTimeInMillis();


Intent intent = new Intent(this, AutoQuitReceiver.class);   //广播

PendingIntent mPendingIntent = PendingIntent.getBroadcast(this, 200,

intent, Intent.FLAG_ACTIVITY_NEW_TASK);


AlarmManager mAlarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);  //系统服务


 //发送一次性广播,手机睡眠状态下也会执行

mAlarmManager.set(AlarmManager.RTC_WAKEUP, setMills, mPendingIntent);  


//发送重复广播,第一次在18点执行,以后每隔5分钟执行一次。

//mAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP, setMills, 1000*60*5, mPendingIntent);


}


public class AutoQuitReceiver extends BroadcastReceiver {  //BroadcastReceiver别忘了在AndroidManifest.xml中注册


@Override

publicvoid onReceive(Context context, Intent intent) {

Toast.makeText(context, "闹钟启动了...", Toast.LENGTH_SHORT).show();

}


}