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

时间:2013-04-22 19:20:27

标签: java android service repeat

我需要构建一个每10/15分钟运行一次的后台任务(这并不重要,或者是好的),即使应用程序没有运行也是如此。

我怎样才能做到这一点?我似乎无法绕过这个。

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

这样做的更好方法是什么?我怎么能这样做?

5 个答案:

答案 0 :(得分:23)

你已经确定了执行一段代码的时间(间隔),使用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

}

答案 1 :(得分:2)

警报管理器(系统服务)与具有内部警报实施的远程服务(单独的过程)?

警报管理器是您的选择,因为它已经拥有您所需要的,您只需设置警报间隔

答案 2 :(得分:1)

您也可以通过SyncAdapter实现此目的 这是一个让你看到并获得灵感的样本

SyncAdapter sample

答案 3 :(得分:0)

最佳方法是在Google I / O 2018中引入的 - WorkManager

您可以找到文档here

答案 4 :(得分:0)

工作经理实际上是最好的做法,它可以定期重复,默认值是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分钟重复一次。