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

Posted

技术标签:

【中文标题】Android workmanager 计划的工作人员在任务被杀死后丢失【英文标题】:Android workmanager scheduled worker lost after task killed 【发布时间】:2019-01-19 16:33:29 【问题描述】:

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

更新: 不仅如此,如果我再次打开应用程序,我会看到 “内部执行,在 workManager 中设置定期工作人员”的日志,但似乎没有安排工作人员,已经超过一个小时并且 logcat 中没有工作人员的日志。

我错过了什么吗?

非常感谢任何帮助!

迭戈

【问题讨论】:

你在哪个安卓设备上测试?,什么是compileSdk版本? 应用重启后能否通过TAG解析task id 抱歉,各位,我一直在忙于发布 alpha 版本。 @kdblue 它的 compileSdkVersion es 27,也在运行 android API 27 的模拟器上进行了测试。 @Ufkoku 不知道我会怎么做... @Dieguinho 我不确定WorkManager requires compileSdk version 28 or higher。我在这里阅读谷歌官方页面 - developer.android.com/topic/libraries/architecture/… 【参考方案1】:

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

【讨论】:

不是这样,我在android emulator API version 27上测试它。设备没有进入打盹模式,我只是从最近的应用程序菜单中杀死应用程序,有时任务会丢失,有时不是 有没有办法通过 ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 意图获得回调结果,以便当用户关闭电池优化时我可以启动活动的方法 我在 Android One 手机上进行测试,该手机按原样使用操作系统,但我面临同样的问题。所以我认为这个问题也可以独立于制造商而存在。 @vaibhavS 你有任何解决方案吗?请帮帮我,我也遇到了同样的问题

以上是关于Android workmanager 计划的工作人员在任务被杀死后丢失的主要内容,如果未能解决你的问题,请参考以下文章

Android WorkManager 实战讲解

Android开发笔记(一百八十八)工作管理器WorkManager

Android开发笔记(一百八十八)工作管理器WorkManager

Android开发笔记(一百八十八)工作管理器WorkManager

Android 工作管理器与服务?

WorkManager 使用入门