Android workmanager计划的工作人员在任务被杀后丢失

Die*_*nho 11 android android-service android-architecture-components android-jetpack android-workmanager

我正在尝试使用新的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;
    }

}
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

更新:不仅如此,但如果我再次打开应用程序,我会看到"内部执行,在workManager中设置定期工作者"的日志,但似乎工作人员没有安排,工作时间超过一小时而且工作人员没有日志存在于logcat中.

我在这里错过了什么吗?

任何帮助是极大的赞赏!!

迭戈

小智 8

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

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

你可以做两件事:

  1. 使用忽略电池优化并将您的应用程序列入白名单。当您启用此功能时,将这样询问用户,

在此处输入图片说明

您可以通过编程方式询问

    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);
Run Code Online (Sandbox Code Playgroud)

在你的清单中

<uses-permission 
android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以将您的应用程序列入白名单,工作经理将起作用,但不幸的是,如果您请求上述权限,Google 将从他们的 Play 商店中删除您的应用程序。没人知道为什么!!!

阅读这篇关于 Google 的反信任问题的文章

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

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

  • 情况并非如此,我正在 android 模拟器 API 版本 27 上进行测试。设备不会进入 Doze 模式,我只是从“最近的应用程序”菜单中终止该应用程序,有时任务会丢失,有时则不会 (2认同)