背景简介
Android应用开发中,闹钟功能是实现定时任务的重要手段。从API级别19开始,Android引入了不精确重复闹钟的概念,而在更高版本中,setAlarmClock方法的引入让闹钟设置更加用户友好。本文将基于这些概念,详细探讨如何在Android应用中使用AlarmManager来调度和处理闹钟。
创建重复闹钟
在Android开发中,重复闹钟可以通过 AlarmManager
类来创建。例如,我们可以通过以下代码创建一个大约两小时后开始,之后每15分钟重复一次的闹钟:
Intent intent = new Intent("my_alarm");
PendingIntent broadcast = PendingIntent.getBroadcast(
this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
long start = System.currentTimeMillis() +
TimeUnit.HOURS.toMillis(2L);
AlarmManager am = (AlarmManager)
getSystemService(ALARM_SERVICE);
am.setRepeating(
AlarmManager.RTC_WAKEUP, start,
AlarmManager.INTERVAL_FIFTEEN_MINUTES, broadcast);
从API级别19开始,所有重复闹钟默认为不精确重复。这意味着闹钟的实际触发时间可能会有所调整,以减少设备唤醒的频率和提高电源效率。如果应用针对的是Android KitKat或更高版本,即使使用 setRepeating()
方法,闹钟也会是不精确的。
使用不精确重复闹钟
为了在所有Android版本上实现不精确重复闹钟,应使用 setInexactRepeating()
方法:
am.setInexactRepeating(
AlarmManager.RTC_WAKEUP, start,
AlarmManager.INTERVAL_FIFTEEN_MINUTES, broadcast);
这种不精确行为通过允许系统调整闹钟触发时间,从而降低设备唤醒频率,提高电源效率。
创建精确重复闹钟
如果需要确保闹钟准时触发,可以使用 setExact()
或 setExactAndAllowWhileIdle()
方法。与不精确闹钟不同,这些方法会尝试在设定时间准确触发闹钟,而不管它是否对电源效率有影响。
使用AlarmClockInfo和setAlarmClock
从API级别21开始, setAlarmClock()
方法允许开发者设置新的闹钟,并在系统状态栏显示闹钟图标。例如,创建一个明天晚上10点的闹钟可以这样实现:
Intent intent = new Intent("my_clock_alarm");
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, 1);
calendar.set(Calendar.HOUR_OF_DAY, 22);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
PendingIntent broadcast = PendingIntent.getBroadcast(
AlarmClockActivity.this, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
if (Build.VERSION.SDK_INT >= 21) {
AlarmClockInfo alarmInfo = new AlarmClockInfo(
calendar.getTimeInMillis(),
createShowDetailsPI());
am.setAlarmClock(alarmInfo, broadcast);
} else {
am.set(AlarmManager.RTC_WAKEUP,
calendar.getTimeInMillis(), broadcast);
}
处理闹钟
闹钟触发后,需要有相应的处理机制。我们可以使用 BroadcastReceiver
、 Activity
或 Service
来处理闹钟事件。例如,使用 BroadcastReceiver
来接收闹钟触发的广播:
public class SMSDispatcher extends BroadcastReceiver {
// 定义接收Intent的key值
public static final String TO_KEY = "to";
public static final String TEXT_KEY = "text";
@Override
public void onReceive(Context context, Intent intent) {
// 从Intent中获取目标号码和消息内容
String to = intent.getStringExtra(TO_KEY);
String text = intent.getStringExtra(TEXT_KEY);
// 发送短信
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(to, null, text, null, 0);
}
}
在Android清单文件中注册该 BroadcastReceiver
:
<receiver android:name=".chapter6.SMSDispatcher">
<intent-filter>
<action android:name="sms_dispacther"/>
</intent-filter>
</receiver>
通过上述方法,我们可以在Android应用中有效地使用闹钟进行定时任务的调度与处理。在实现精确与不精确闹钟时,开发者应根据具体需求选择合适的策略,并注意不同API级别之间的兼容性问题。