Android WorkManager 计划任务在任务被杀死后丢失

14

我正在尝试使用新的WorkManager API 1.0.0-alpha06来使一个worker每15分钟运行一次。如果我没错的话,使用PeriodicWorkRequest和Work manager应该使得worker在任务被杀死和手机重启后继续存在,但是当我从最近的应用中滑动任务时,预定的worker就会丢失(我已经等待了大约45分钟,以查看任何15分钟间隔调度的worker日志)。

这些是我的文件:

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

这里我是否漏掉了什么?

非常感谢任何帮助!

Diego


你正在测试哪个安卓设备?编译SDK版本是多少? - iamkdblue
在应用程序重新启动后,您能否通过TAG解决task id - Ufkoku
1
@Dieguinho 我不确定 WorkManager 需要编译SDK版本28或更高版本。我在这里阅读了谷歌官方页面 - https://developer.android.com/topic/libraries/architecture/adding-components#workmanager - iamkdblue
@Dieguinho 你有没有找到解决方案,因为我也在同样的困境中。 - Vivek Samele
@VivekKumarSamele,我真的不记得了,但已经有一段时间了,随后的WorkManager版本应该更加稳定。 - Dieguinho
显示剩余4条评论
1个回答

9
这是由电池优化和/或Doze模式引起的问题,特别是在使用像氧气OS、MIUI等中文ROM时发生。
在原始ROM上测试您的应用程序,这将完美地工作。根本没有任何问题。这是因为这些中文ROM启用了自定义省电技术,防止任何后台服务运行。
你可以做两件事:
1.使用忽略电池优化并将您的应用程序列入白名单。当您启用此功能时,用户会被要求这样做,
  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反垄断问题的文章

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

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


2
这并不是这种情况,我正在 Android 模拟器 API 版本 27 上进行测试。设备没有进入 Doze 模式,我只是从“最近使用的应用”菜单中杀死了应用程序,有时任务会丢失,有时则不会。 - Dieguinho
有没有一种方法可以获取ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS意图的回调结果,以便当用户关闭电池优化时,我可以启动活动的方法? - Ankesh kumar Jaisansaria
我在一部使用原生操作系统的Android One手机上进行测试,遇到了同样的问题。因此我认为这个问题可能与制造商无关。 - fsljfke
1
@vaibhavS 你有解决方案吗?请帮帮我,我也卡在同样的问题上了。 - Ravindra Kushwaha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接