关闭的应用程序如何在 Android 10 上使用 WorkManager 执行定期工作?

How can a closed application perform periodic work with WorkManager on Android 10?

我在这里问了一个关于周期性工作的问题:。答案是使用 WorkManager,这在 Android 9.

上是一个很好的解决方案

在另一台使用 Android10 的设备上,前一个问题的解决方案不再有效。这似乎是一个普遍的问题。这里的问题已经被投票了很多,但是它的单一答案没有被接受,它也没有帮助我:WorkManager not working when app killed in Android 10 although working fine till version 9 (Pie).

所以我想针对Android 10制定一个具体的问题。有谁知道如何解决吗?

  1. 在 AndroidStudio 中使用 File->New->New Project...->Empty Activity->[ 创建一个空 activity =18=].
  2. 添加一个 class MyWorker,内容如下:
package org.test.myapplication;

import android.content.Context;
import android.media.AudioManager;
import android.media.ToneGenerator;
import android.os.Handler;
import android.os.Looper;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.work.Worker;
import androidx.work.WorkerParameters;

public class MyWorker extends Worker
{
    public MyWorker(@NonNull Context context, @NonNull WorkerParameters params)
    {
        super(context, params);
    }

    @Override
    public Result doWork()
    {
        Handler handler = new Handler(Looper.getMainLooper());
        handler.postDelayed(new Runnable()
        {
            @Override
            public void run()
            {
                // Play tone to show that the worker is working
                ToneGenerator toneGenerator = new ToneGenerator(AudioManager.STREAM_MUSIC, 200);
                        toneGenerator.startTone(ToneGenerator.TONE_CDMA_EMERGENCY_RINGBACK, 1000);

                // Also display some message
                Toast.makeText(getApplicationContext(), "Testing", Toast.LENGTH_SHORT).show();
            }
        }, 1000);

        // Indicate whether the work finished successfully with the Result
        return Result.success();
    }
}
  1. 修改classMainActivity内容如下:
package org.test.myapplication;

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;
import androidx.work.PeriodicWorkRequest;
import androidx.work.WorkManager;
import androidx.work.WorkRequest;

import java.util.concurrent.TimeUnit;

public class MainActivity extends AppCompatActivity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        WorkRequest workRequest =
                new PeriodicWorkRequest.Builder(MyWorker.class, 15, TimeUnit.MINUTES).build();

        WorkManager.getInstance(this).enqueue(workRequest);
    }
}
  1. 安装并运行 应用程序。播放来自 MyWorker::doWork 的提示音并显示相应的 toast。
  2. 现在向上滑动 activity 将其关闭。

期望:定期工作应该像在 Android 9.

上一样继续执行

实际行为:不再发生任何事情。 WorkManager显然已经停止了。

问题:如何修改示例以在 Android 10 上运行?

代码或项目设置没有任何问题。我的设备一直处于省电模式,这显然阻止了 activity 关闭时的周期性 WorkManager 任务。退出省电模式已解决问题。