gpt4 book ai didi

任务终止后,Android workmanager 计划的工作人员丢失

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:10:19 24 4
gpt4 key购买 nike

我正在尝试使用新的 WorkManager API 1.0.0-alpha06 让工作人员每 15 分钟运行一次。如果我没记错的话,将工作管理器与 PeriodicWorkRequest 一起使用应该会使工作人员在任务终止和手机重启后存活下来,但是当我从最近的应用程序中刷任务时,预定的工作人员会丢失(我已经等了大约 45 分钟,以查看计划间隔 15 分钟的工作人员的任何日志)。

这些是我的文件:

MyExampleWorker.java:

public class MyExampleWorker extends Worker{
public static final String TAG = "MY_EXAMPLE_WORKER";

@NonNull
@Override
public Result doWork() {
Log.i(TAG, "Starting background worker");
// Getting configuration data
long param1 = getInputData().getLong("param1", 60000);
String param2 = getInputData().getString("param2");
String param3 = getInputData().getString("param3");

PackageManager pckMgr = mContext.getPackageManager();
...
..
.
return Result.SUCCESS;
}

}

主要.java:一旦应用程序启动,此方法就会触发

@ReactMethod
public void execute() {
Log.i(TAG, "inside execute, setting up periodic worker in workManager");

Data inputData = new Data.Builder()
.putLong("param1", 60000)
.putString("param2", "something")
.putString("param3", "something else")
.build();

PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest
.Builder(MyExampleWorker.class, PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS, TimeUnit.MILLISECONDS)
.setInputData(inputData)
.addTag(MyExampleWorker.TAG)
.build();

WorkManager.getInstance().enqueueUniquePeriodicWork(MyExampleWorker.TAG, ExistingPeriodicWorkPolicy.KEEP, periodicWorkRequest);
}

更新:不仅如此,如果我再次打开该应用程序,我会看到“inside execute, setting set up a periodic worker in workManager” 的日志,但似乎该 worker 没有安排,已经超过一个小时了并且 logcat 中没有工作人员的日志。

我是不是漏掉了什么?

非常感谢任何帮助!!

迭戈

最佳答案

这是由电池优化和/或打瞌睡模式引起的问题,尤其是当您使用 Oxygen OS、MIUI 等中文 Rom 时。

在 Stock Rom 上测试你的应用程序,这将工作得很好。根本不会有任何问题。这是因为这些中文 ROM 启用了他们的自定义节电技术,可以防止任何后台服务运行。

您可以做两件事:

  1. 使用忽略电池优化并将您的应用列入白名单。启用此功能后,系统会这样询问用户,

enter image description here

您可以通过编程方式询问

    Intent intent = new Intent();
String packageName = context.getPackageName();
PowerManager pm = (PowerManager)
context.getSystemService(Context.POWER_SERVICE);
if (pm.isIgnoringBatteryOptimizations(packageName))
intent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
else {
intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + packageName));
}
context.startActivity(intent);

在你的 list 中

<uses-permission 
android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>

通过这种方式,您可以将您的应用列入白名单,并且工作管理器可以正常工作,但不幸的是,如果您请求上述许可,Google 将从他们的 Play 商店中删除您的应用。没有人知道为什么!!!

Read this article on Google's Anti Trust Issues

  1. 第二种方法是您可以通过不显示上述对话框来要求用户将他们的应用列入白名单。你可以做到这一点

startActivityForResult(new Intent(android.provider.Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS), 0);

关于任务终止后,Android workmanager 计划的工作人员丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51813961/

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