我需要构建一个每 10/15 分钟运行一次的后台任务(没关系,要么很好),即使应用程序没有运行。
我怎样才能做到这一点?我似乎无法解决这个问题。
我读到我可以使用某种 runnable() 功能或使用后台服务或 AlarmManager。我在考虑后台服务,因为它也必须在应用程序本身未运行时完成。
有什么更好的方法可以做到这一点,我该怎么做?
您已经确定了执行一段代码的时间(间隔),最好使用AlarmManager,因为它更节能。如果你的应用需要监听某种事件,那么 Service 就是你所需要的。
public static void registerAlarm(Context context) {
Intent i = new Intent(context, YOURBROADCASTRECIEVER.class);
PendingIntent sender = PendingIntent.getBroadcast(context,REQUEST_CODE, i, 0);
// We want the alarm to go off 3 seconds from now.
long firstTime = SystemClock.elapsedRealtime();
firstTime += 3 * 1000;//start 3 seconds after first register.
// Schedule the alarm!
AlarmManager am = (AlarmManager) context
.getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime,
600000, sender);//10min interval
}
警报管理器(系统服务)与具有内部警报实现(单独进程)的远程服务?
警报管理器是您的选择,因为它已经拥有您所需要的,您只需设置警报间隔
您也可以通过 SyncAdapter 实现此目的 这是一个示例供您查看并获得启发
工作经理实际上是最好的定期重复,他们的默认值是 15 分钟,这正是你需要的。这是一个例子:
final PeriodicWorkRequest periodicWorkRequest
= new PeriodicWorkRequest.Builder(ApiWorker.class, 15, TimeUnit.MINUTES)
.build();
WorkManager.getInstance().enqueue(periodicWorkRequest);
其中 ApiWorker 只是以下类:
public class ApiWorker extends Worker implements iOnApiRequestSuccessful {
public ApiWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
}
@NonNull
@Override
public Result doWork() {
return Result.success();
}
}
并在成功返回之前在 doWork() 函数中填写您想要完成的任何工作。
Return.success() 使其再次插入队列,因此它将每 15 分钟重复一次。
最好的方法是在 Google I/O 2018 - WorkManager上介绍的。
您可以在此处找到文档。