Java Android-每15分钟运行一次后台任务,即使应用程序未运行

Java Android-每15分钟运行一次后台任务,即使应用程序未运行,java,android,service,repeat,Java,Android,Service,Repeat,我需要构建一个每10/15分钟运行一次的后台任务(其实并不重要,也很好),即使应用程序没有运行 我怎样才能做到这一点?我似乎无法理解这件事 我读到我可以使用某种runnable()功能,或者使用后台服务或AlarmManager。我考虑的是后台服务,因为它也必须在应用程序本身不运行时完成 做这件事的更好方法是什么?我该如何做?您已经确定了执行一段代码的时间(间隔),最好使用它,因为它更节能。如果你的应用程序需要收听某种事件,那么服务就是你所需要的 public static void regis

我需要构建一个每10/15分钟运行一次的后台任务(其实并不重要,也很好),即使应用程序没有运行

我怎样才能做到这一点?我似乎无法理解这件事

我读到我可以使用某种runnable()功能,或者使用后台服务或AlarmManager。我考虑的是后台服务,因为它也必须在应用程序本身不运行时完成


做这件事的更好方法是什么?我该如何做?

您已经确定了执行一段代码的时间(间隔),最好使用它,因为它更节能。如果你的应用程序需要收听某种事件,那么服务就是你所需要的

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实现这一点 这里有一个样本供您参考和启发


最佳方法是在2018年谷歌I/O大会上推出的


您可以找到文档。

工作管理器实际上是定期重复的最佳选择,默认值为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分钟重复一次。

但这是否允许我在应用程序本身未运行时执行代码?是的。Alarm Manager就像,你(应用程序)告诉操作系统你想在X百万秒后做某事。然后系统在broadcastReceiver.onReceive()中执行该代码,这是您希望在x毫秒后在后台执行的代码。它工作得很好,但是,停止服务怎么样?am.cancel()?或谢谢@wtsang02如果我需要每100毫秒运行一次后台任务怎么办?将“600000”替换为100,这是以毫秒为单位的间隔。