调度重复的闹钟
2016-11-30 10:24
204 查看
闹钟的具体类型:
ELAPSED_REALTIME:从设备启动之后开始算起,度过了某一段特定时间后,激活 Pending Intent,但不会唤醒设备。其中设备睡眠的时间也会包含在内。
ELAPSED_REALTIME_WAKEUP:从设备启动之后开始算起,度过了某一段特定时间后唤醒设备。
RTC:在某一个特定时刻激活 Pending Intent,但不会唤醒设备。
RTC_WAKEUP:在某一个特定时刻唤醒设备并激活 Pending Intent。
在一分钟后唤醒设备并激活一个一次性(无重复)闹钟:
让设备精确地在上午 8 点半被唤醒并激活闹钟,自此之后每 20 分钟唤醒一次:
使用
2. 实现 BoradcastReceiver 用于接收广播:
3. 在你的 Manifest 文件中添加一个接收器,其 Intent-Filter 接收 ACTION_BOOT_COMPLETED 这一 Action:
注意 Manifest 文件中,对接收器设置了
一旦你像上面那样启动了接收器,它将一直保持启动状态,即使用户重启了设备也不例外。换句话说,通过代码设置的启用配置将会覆盖掉 Manifest 文件中的现有配置,即使重启也不例外。接收器将保持启动状态,直到你的应用将其禁用。你可以像下面这样禁用接收器(比如用户取消了一个闹钟):
参考:
http://hukai.me/android-training-course-in-chinese/background-jobs/scheduling/alarms.html
ELAPSED_REALTIME:从设备启动之后开始算起,度过了某一段特定时间后,激活 Pending Intent,但不会唤醒设备。其中设备睡眠的时间也会包含在内。
ELAPSED_REALTIME_WAKEUP:从设备启动之后开始算起,度过了某一段特定时间后唤醒设备。
RTC:在某一个特定时刻激活 Pending Intent,但不会唤醒设备。
RTC_WAKEUP:在某一个特定时刻唤醒设备并激活 Pending Intent。
ELAPSED_REALTIME_WAKEUP 案例
每隔在 30 分钟后唤醒设备以激活闹钟:// Hopefully your alarm will have a lower frequency than this! alarmMgr.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, AlarmManager.INTERVAL_HALF_HOUR, AlarmManager.INTERVAL_HALF_HOUR, alarmIntent);
在一分钟后唤醒设备并激活一个一次性(无重复)闹钟:
private AlarmManager alarmMgr; private PendingIntent alarmIntent; ... alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(context, AlarmReceiver.class); alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0); alarmMgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 60 * 1000, alarmIntent);
RTC 案例
在大约下午 2 点唤醒设备并激活闹钟,并不断重复:// Set the alarm to start at approximately 2:00 p.m. Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.set(Calendar.HOUR_OF_DAY, 14); // With setInexactRepeating(), you have to use one of the AlarmManager interval // constants--in this case, AlarmManager.INTERVAL_DAY. alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, alarmIntent);
让设备精确地在上午 8 点半被唤醒并激活闹钟,自此之后每 20 分钟唤醒一次:
private AlarmManager alarmMgr; private PendingIntent alarmIntent; ... alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(context, AlarmReceiver.class); alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0); // Set the alarm to start at 8:30 a.m. Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.set(Calendar.HOUR_OF_DAY, 8); calendar.set(Calendar.MINUTE, 30); // setRepeating() lets you specify a precise custom interval--in this case, // 20 minutes. alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 1000 * 60 * 20, alarmIntent);
使用
setRepeating()时,你可以制定一个自定义的时间间隔,但在使用
setInexactRepeating()时不支持这么做。此时你只能选择一些时间间隔常量,例如:INTERVAL_FIFTEEN_MINUTES ,INTERVAL_DAY 等。完整的常量列表,可以查看 AlarmManager。
取消闹钟
你可能希望在应用中添加取消闹钟的功能。要取消闹钟,可以调用 AlarmManager 的cancel()方法,并把你不想激活的 PendingIntent 传递进去,例如:
// If the alarm has been set, cancel it. if (alarmMgr!= null) { alarmMgr.cancel(alarmIntent); }
在设备启动后启用闹钟
1. 在应用的 Manifest 文件中设置 RECEIVE_BOOT_CMPLETED 权限,这将允许你的应用接收系统启动完成后发出的 ACTION_BOOT_COMPLETED 广播(只有在用户至少将你的应用启动了一次后,这样做才有效):<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
2. 实现 BoradcastReceiver 用于接收广播:
public class SampleBootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) { // Set the alarm here. } } }
3. 在你的 Manifest 文件中添加一个接收器,其 Intent-Filter 接收 ACTION_BOOT_COMPLETED 这一 Action:
<receiver android:name=".SampleBootReceiver" android:enabled="false"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"></action> </intent-filter> </receiver>
注意 Manifest 文件中,对接收器设置了
android:enabled="false"属性。这意味着除非应用显式地启用它,不然该接收器将不被调用。这可以防止接收器被不必要地调用。你可以像下面这样启动接收器(比如用户设置了一个闹钟):
ComponentName receiver = new ComponentName(context, SampleBootReceiver.class); PackageManager pm = context.getPackageManager(); pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
一旦你像上面那样启动了接收器,它将一直保持启动状态,即使用户重启了设备也不例外。换句话说,通过代码设置的启用配置将会覆盖掉 Manifest 文件中的现有配置,即使重启也不例外。接收器将保持启动状态,直到你的应用将其禁用。你可以像下面这样禁用接收器(比如用户取消了一个闹钟):
ComponentName receiver = new ComponentName(context, SampleBootReceiver.class); PackageManager pm = context.getPackageManager(); pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
参考:
http://hukai.me/android-training-course-in-chinese/background-jobs/scheduling/alarms.html
相关文章推荐
- 调度重复的闹钟
- Android重复闹钟(每天)的实现 Android之AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作
- Linux中的计划任务—Crontab调度重复执行的任务
- c#部分---网吧充值系统;简易的闹钟;出租车计费;简单计算器;对战游戏;等额本金法计算贷款还款利息等;随机生成10个不重复的50以内的整数;推箱子;
- Android重复闹钟(每天)的实现
- 关于AlarmManager设置重复闹钟延迟的问题
- Scheduling Repeating Alarms -- 设置重复闹钟
- Android重复报警调度问题
- Android重复闹钟(每天)的实现
- DeskClock选择闹钟声音时有重复选项
- 用apscheduler处理调度任务,定时任务,重复任务
- Android重复闹钟(每天)的实现
- 添加每天重复的闹钟,更改日期为2天后再改回来,前面两天的闹钟不会响
- Java重复调度定时任务的几种方法
- Quartz:不要重复造轮子,一款企业级任务调度框架。
- sqlserver2000重复作业调度
- javascript下过滤数组重复值的代码
- tip8: 不要重复,如:mysql的目录名与库名
- 浅谈pthread和Linux调度策略
- [编写高质量代码:改善java程序的151个建议]建议79 HashMap中的key不要重复