问题描述
我在这里问了一个关于定期工作的问题: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制定一个具体问题。有谁知道如何解决它?
- 在 AndroidStudio 中使用
File
->New
->New Project...
->Empty Activity
->Language: Java,SDK: API 28
创建一个空活动。 - 添加一个包含以下内容的类 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();
}
}
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);
}
}
期望:应该像在 Android 9 上一样继续执行定期工作。
实际行为:不再发生任何事情。 WorkManager
显然已停止。
问题:如何修改示例以在 Android 10 上运行?
解决方法
代码或项目设置没有任何问题。我的设备一直处于省电模式,这显然阻止了 Activity 关闭时的周期性 WorkManager
任务。退出省电模式解决了问题。