首页 文章

Android workmanager预定工作人员在任务被杀后丢失

提问于
浏览
7

我正在尝试使用新的WorkManager API 1.0.0-alpha06每15分钟运行一次工作 . 如果我没有错,使用带有PeriodicWorkRequest的工作管理器应该让工作人员彻底杀死任务并重新启动电话,但是当我从最近的应用程序中滑动任务时,预定的工作人员会丢失(我等了大约45分钟才看到任何人 Worker 的日志安排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);
}

UPDATE :不仅如此,但如果我再次打开应用程序,我会看到"inside execute, setting up a periodic worker in workManager"的日志,但似乎工作人员没有安排,已经超过一个小时,并且logcat中没有该工作人员的日志 .

我在这里错过了什么吗?

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

迭戈

1 回答

  • 1

    这是由电池优化和/或打盹模式引起的问题,尤其是当您使用中国Rom如Oxygen OS,MIUI等时 .

    在Stock Rom上测试你的应用程序,这将完美无缺 . 根本没有问题 . 这是因为这些中文ROM启用了自定义节电技术,可以防止任何后台服务运行 .

    你可以做两件事:

    • 使用忽略电池优化并将应用程序列入白名单 . 启用此功能后,系统会询问用户是这样的,

    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"/>
    

    通过这种方式,您可以将应用程序列入白名单,工作经理也可以使用, but unfortunately, Google will remove your app from their play store if you request the above permission. No one knows why!!!

    Read this article on Google's Anti Trust Issues

    • 第二种方法是,您可以通过不显示上述对话框让用户将其应用列入白名单 . 你可以这样做

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

相关问题