注意:本帖已更新以包含 Android Lollipop 发布的 JobScheduler
API。下面仍然是一种可行的方式,但如果您的目标是 Android Lollipop 及以上版本,则可以被视为已弃用。查看后半部分以获取 JobScheduler
的替代方案。
执行重复任务的一种方法如下:
public class AlarmReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
Intent myService = new Intent(context, YourService.class);
context.startService(myService);
}
}
假设YourService
是您的服务;-)
如果您需要为您的任务获取唤醒锁,则建议从 WakefulBroadcastReceiver
扩展。在这种情况下,请不要忘记在Manifest中添加 WAKE_LOCK
权限!
要启动您的定期轮询,请在您的活动中执行此代码:
Intent myAlarm = new Intent(getApplicationContext(), AlarmReceiver.class);
PendingIntent recurringAlarm = PendingIntent.getBroadcast(getApplicationContext(), 0, myAlarm, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarms = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
Calendar updateTime = Calendar.getInstance();
alarms.setInexactRepeating(AlarmManager.RTC_WAKEUP, updateTime.getTimeInMillis(), AlarmManager.INTERVAL_DAY, recurringAlarm);
这段代码设置了一个可取消的pendingIntent
和alarm
。alarmManager
将重复执行recurringAlarm
(第三个参数)每天一次,但是执行时间是不精确的,大约在间隔时间之后唤醒CPU而不是精确地唤醒(它让操作系统选择最佳时间,从而减少电池消耗)。第一次启动闹钟(和服务)的时间将是您选择的updateTime
时间。
Intent myAlarm = new Intent(getApplicationContext(), AlarmReceiver.class);
PendingIntent recurringAlarm = PendingIntent.getBroadcast(getApplicationContext(), 0, myAlarm, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarms = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
alarms.cancel(recurringAlarm);
这段代码创建了一个现有闹钟的副本,并告诉
alarmManager
取消所有这种类型的闹钟。
- 当然,在
Manifest
中也有一些需要处理的内容:
包含这两行代码。
< receiver android:name=".AlarmReceiver"></receiver>
< service android:name=".YourService"></service>
在 <application>
标签内部。如果没有它,系统不会接受服务重复闹钟的启动。
从 Android Lollipop 发布开始,有一种新的优雅解决此任务的方法。这也使得仅在满足某些条件(如网络状态)时执行操作更加容易。
ComponentName mServiceComponent = new ComponentName(context, MyJobService.class);
JobInfo task = JobInfo.Builder(mJobId, mServiceComponent)
.setPeriodic(mIntervalMillis)
.setRequiresCharging(true)
.setRequiredNetworkCapabilities(JobInfo.NetworkType.UNMETERED)
.build();
JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(task);
你也可以通过 setOverrideDeadline(maxExecutionDelayMillis)
来设置任务的截止时间。
要取消这样的任务,只需调用jobScheduler.cancel(mJobId);
或jobScheduler.cancelAll();
即可。