注意:这篇文章已更新,包括JobScheduler
Android Lollipop 版本的 API。以下仍然是一种可行的方法,但如果您的目标是 Android Lollipop 及更高版本,则可以认为已弃用。请参阅后半部分JobScheduler
选择。
执行重复任务的一种方法是:
-
创建一个类AlarmReceiver
public class AlarmReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
Intent myService = new Intent(context, YourService.class);
context.startService(myService);
}
}
with YourService
为您服务;-)
如果您的任务需要唤醒锁,建议从WakefulBroadcastReceiver。不要忘记添加WAKE_LOCK
在这种情况下,请在您的清单中获得许可!
要开始定期轮询,请在您的活动中执行以下代码:
Intent myAlarm = new Intent(getApplicationContext(), AlarmReceiver.class);
//myAlarm.putExtra("project_id", project_id); //Put Extra if needed
PendingIntent recurringAlarm = PendingIntent.getBroadcast(getApplicationContext(), 0, myAlarm, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarms = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
Calendar updateTime = Calendar.getInstance();
//updateTime.setWhatever(0); //set time to start first occurence of alarm
alarms.setInexactRepeating(AlarmManager.RTC_WAKEUP, updateTime.getTimeInMillis(), AlarmManager.INTERVAL_DAY, recurringAlarm); //you can modify the interval of course
这段代码设置了一个alarm
和一个可取消的pendingIntent
. The alarmManager
得到重复的工作recurringAlarm
每天(第三个参数),但是inexact因此 CPU 会在大约该间隔后唤醒,但不会完全唤醒(它让操作系统选择最佳时间,从而减少电池消耗)。警报(以及服务)第一次启动将是您选择的时间updateTime
.
-
最后但并非最不重要的一点:以下是如何消除重复出现的警报
Intent myAlarm = new Intent(getApplicationContext(), AlarmReceiver.class);
//myAlarm.putExtra("project_id",project_id); //put the SAME extras
PendingIntent recurringAlarm = PendingIntent.getBroadcast(getApplicationContext(), 0, myAlarm, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarms = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
alarms.cancel(recurringAlarm);
此代码创建您(可能)现有警报的副本并告诉alarmManager
取消所有此类警报。
包括这两行
< receiver android:name=".AlarmReceiver"></receiver>
< service android:name=".YourService"></service>
在 - 的里面< application>
-标签。如果没有它,系统不接受服务的周期性警报的启动。
从安卓棒棒糖发布后,有一种新方法可以优雅地解决此任务。
这也使得仅在满足某些标准(例如网络状态)时才执行操作变得更加容易。
// wrap your stuff in a componentName
ComponentName mServiceComponent = new ComponentName(context, MyJobService.class);
// set up conditions for the job
JobInfo task = JobInfo.Builder(mJobId, mServiceComponent)
.setPeriodic(mIntervalMillis)
.setRequiresCharging(true) // default is "false"
.setRequiredNetworkCapabilities(JobInfo.NetworkType.UNMETERED) // Parameter may be "ANY", "NONE" (=default) or "UNMETERED"
.build();
// inform the system of the job
JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(task);
您还可以提供截止日期setOverrideDeadline(maxExecutionDelayMillis)
.
要摆脱这样的任务,只需调用jobScheduler.cancel(mJobId);
or jobScheduler.cancelAll();
.