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

问题描述

在这里问了一个关于定期工作的问题:How can a closed application receive periodic broadcasts?。答案是使用 WorkManager,这是 Android 9 上的一个很好的解决方案。

在另一台使用 Android 10 的设备上,前一个问题的解决方案不再适用。这似乎是一个普遍的问题。这里的问题已经得到了很多支持,但它的单一答案没有被接受,也没有帮助我: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->Language: Java,SDK: API 28 创建一个空活动。
  2. 添加一个包含以下内容的类 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. 修改MainActivity 以具有以下内容
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提示音并显示相应的祝酒词。
  2. 现在向上滑动活动以关闭它。

期望:应该像在 Android 9 上一样继续执行定期工作。

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

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

解决方法

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