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

时间:2018-08-13 00:40:19

标签: 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;
    }

}

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中没有该工作者的日志。

我在这里想念东西吗?

任何帮助深表感谢!

迭戈

1 个答案:

答案 0 :(得分:3)

这是由电池优化和/或打ze模式引起的问题,尤其是当您使用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);

在你的清单上

<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);