我正在尝试使用新的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;
}
}
Main.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);
}
更新: 不仅如此,而且如果我再次打开该应用程序,我会看到“在内部执行,在workManager中设置定期工作人员” 的日志,但似乎该工作人员未安排好时间,已经超过了一个小时,并且logcat中没有该工作者的日志。
我在这里想念东西吗?
任何帮助深表感谢!
迭戈
答案 0 :(得分:3)
这是由电池优化和/或打ze模式引起的问题,尤其是当您使用Oxygen OS,MIUI等中文Rom时。
在Stock Rom上测试您的应用程序,这将完全正常。根本没有问题。这是因为这些中文ROM启用了自定义的节能技术,从而阻止了任何后台服务运行。
您可以做两件事:
您可以通过编程方式提问
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);
在你的清单上
<uses-permission
android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
通过这种方式,您可以将您的应用列入白名单,并且工作经理可以使用,,但是很遗憾,如果您请求上述许可,Google将从您的Play商店中删除您的应用。没有人知道为什么!
Read this article on Google's Anti Trust Issues
startActivityForResult(new Intent(android.provider.Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS), 0);