您的位置:首页 > 移动开发 > Android开发

调度重复的闹钟

2016-11-30 10:24 204 查看
闹钟的具体类型:

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 培训