关闭的应用程序如何在 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制定一个具体的问题。有谁知道如何解决吗?
- 在 AndroidStudio 中使用
File
->New
->New Project...
->Empty Activity
->[ 创建一个空 activity =18=].
- 添加一个 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();
}
}
- 修改class
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);
}
}
- 安装并运行 应用程序。播放来自
MyWorker::doWork
的提示音并显示相应的 toast。
- 现在向上滑动 activity 将其关闭。
期望:定期工作应该像在 Android 9.
上一样继续执行
实际行为:不再发生任何事情。 WorkManager
显然已经停止了。
问题:如何修改示例以在 Android 10 上运行?
代码或项目设置没有任何问题。我的设备一直处于省电模式,这显然阻止了 activity 关闭时的周期性 WorkManager
任务。退出省电模式已解决问题。
我在这里问了一个关于周期性工作的问题:WorkManager
,这在 Android 9.
在另一台使用 Android10 的设备上,前一个问题的解决方案不再有效。这似乎是一个普遍的问题。这里的问题已经被投票了很多,但是它的单一答案没有被接受,它也没有帮助我: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
->[ 创建一个空 activity =18=]. - 添加一个 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();
}
}
- 修改class
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);
}
}
- 安装并运行 应用程序。播放来自
MyWorker::doWork
的提示音并显示相应的 toast。 - 现在向上滑动 activity 将其关闭。
期望:定期工作应该像在 Android 9.
上一样继续执行实际行为:不再发生任何事情。 WorkManager
显然已经停止了。
问题:如何修改示例以在 Android 10 上运行?
代码或项目设置没有任何问题。我的设备一直处于省电模式,这显然阻止了 activity 关闭时的周期性 WorkManager
任务。退出省电模式已解决问题。