gpt4 book ai didi

java - 如何安排任务以使其在android中的任何条件下执行

转载 作者:行者123 更新时间:2023-11-30 04:54:53 25 4
gpt4 key购买 nike

我正在开发一个需要在某些时间运行一些任务的 Android 项目。要执行的任务由用户选择以及需要执行的时间。我曾尝试使用 BroadcastReceiverAlarmManager 来执行任务。但问题是 - 应用关闭时任务停止执行。下面是我的 BroadcastReceiverAlarmManager 类代码。

public class AlarmReceiver extends BroadcastReceiver {

private static final String TAG = "AlarmReceiver";

@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "onReceive: Alarm received");

// perform the task here using the values received by Intent
}
}

我使用 AlarmManager 将此 AlarmReceiver 称为:

    Intent alarmIntent = new Intent(this, AlarmReceiver.class);
alarmIntent.putExtra("foo", foo);
alarmIntent.putExtra("bar", bar);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, date.getTime(), pendingIntent);

其中 date.getTime() 是执行任务的时间。

一切正常。但是我想要一个解决方案,即使应用被强行关闭也能使这项工作正常进行。我还希望该解决方案能够一个接一个甚至第二天执行多个此类任务。 如果可能

注意:我想过使用 Service 类来完成此操作,但不知道如何编写 Service 类。

最佳答案

我认为强制关闭不会让任务继续工作。但是,您可以在系统事件上注册 BroadcastReceiver,让应用程序恢复运行(例如 android.intent.action.BOOT_COMPLETED 和 QUICKBOOT_POWERON)

对于任务,您真的应该查看 WorkManager 库。

参见:https://developer.android.com/reference/androidx/work/package-summaryhttps://developer.android.com/topic/libraries/architecture/workmanager它为你监听系统事件做了很多工作。它为重复性和单一任务提供 PeriodicWorkRequest 和 OneTimeWorkRequest。

最新库:androidx.work:work-runtime:2.2.0

import androidx.work.Constraints
import androidx.work.ExistingPeriodicWorkPolicy.REPLACE
import androidx.work.PeriodicWorkRequest
import androidx.work.WorkManager

private fun startTask(interval: Int) {
val flexInterval = when {
interval > 200 -> 30L
interval > 59 -> 15L
else -> 5L
}
val constraints = Constraints.Builder().setRequiresBatteryNotLow(true).build()

val fileFinderWork = PeriodicWorkRequest.Builder(
FileFindWorker::class.java,
interval.toLong(), TimeUnit.MINUTES,
flexInterval, TimeUnit.MINUTES
).setConstraints(constraints).addTag(WORK_TAG).build()

Logger.e("Enqueueing file finder worker ($interval min.)")

val manager: WorkManager = WorkManager.getInstance(ctx)
manager.enqueueUniquePeriodicWork(WORK_NAME, REPLACE, fileFinderWork)
}

或者在 Java 中

import androidx.work.Constraints;
import androidx.work.ExistingPeriodicWorkPolicy;
import androidx.work.OneTimeWorkRequest;
import androidx.work.PeriodicWorkRequest;
import androidx.work.WorkManager;

private UUID startTask() {
int interval = 99 /* Just a value from configuration */;
TimeUnit unit;
int flexInterval;

if (interval % 60 == 0) {
interval = interval / 60;
unit = TimeUnit.HOURS;
} else {
unit = TimeUnit.MINUTES;
}

if (interval >= 240) {
flexInterval = 30;
} else if (interval >= 60) {
flexInterval = 15;
} else {
flexInterval = 5;
}

final Constraints constraints = new Constraints.Builder()
.setRequiresBatteryNotLow(true)
.build();

final PeriodicWorkRequest fileFinderWork = new PeriodicWorkRequest.Builder(
FileFindWorker.class, interval, unit, flexInterval, TimeUnit.MINUTES)
.setConstraints(constraints)
.addTag(WORK_TAG)
.build();

lastPeriodicUuid = fileFinderWork.getId();

WorkManager manager = WorkManager.getInstance(ctx)
manager.enqueueUniquePeriodicWork(WORK_NAME, ExistingPeriodicWorkPolicy.REPLACE, fileFinderWork);

return fileFinderWork.getId();
}

关于java - 如何安排任务以使其在android中的任何条件下执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59424816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com