WorkManager的约束条件(setRequiresCharging)在模拟器上无法工作

4

我正在使用OneTimeWorkRequest设置约束-"setRequiresCharging",但是当我将电池状态从放电切换到充电时,该工作请求不会调用doWork方法。

这个问题存在于模拟器上,在我的真实设备上运行正常,因此我认为它可能不适用于所有设备。

public class MainActivity extends AppCompatActivity {

    WorkManager mWorkManager;
    public static final String TAG="MainActivityTag";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mWorkManager = WorkManager.getInstance();
        setupWorkRequest();
    }

    private void setupWorkRequest() {
        Log.d(TAG, "setupWorkRequest: " + "setting request");
        // Create charging constraint
        Constraints constraints = new Constraints.Builder()
                .setRequiresCharging(true)
                .build();
        OneTimeWorkRequest chargerListen = new OneTimeWorkRequest
                .Builder(ChargerListener.class)
                .setConstraints(constraints)
                .build();
        mWorkManager.enqueue(chargerListen);
    }
}

public class ChargerListener extends Worker {

    private static final String TAG = "ChargerListenerTag";

     public ChargerListenerWork(Context context, WorkerParameters workerParams){
        super(context, workerParams);
    }

    @NonNull
    @Override
    public Result doWork() {
        Log.d(TAG, "doWork: "+"Charger Connected");
        // do some work when connected
        return Result.success();
    }
}

在logcat中,我希望能看到充电器连接的信息,这在我的三星设备上可以实现,但在Android模拟器上无法实现。

1
我也遇到了同样的问题,在模拟器上无法运行,而且在任何安装有Android 10或11的真实设备上都无法运行,包括Pixel 4。在模拟器上,当充电电量超过90%时似乎开始工作。这并不是“setRequiresCharging”函数承诺的功能。 - Pointer Null
4个回答

2
我刚刚尝试了使用WorkManager v2.1.x的codelab中的示例,并且当我在模拟器上设置正确的电池和充电状态时,它可以正常工作(我正在使用v29.0.9-5537588)。

enter image description here


1
我发现,为了使条件setRequiresCharging(true)生效并触发doWork(),需要满足两个条件:
  1. 设备(或模拟器)应该插入电源或USB。
  2. 这是关键 - 电池充电水平应该增加至少1%。
在我看来,最简单的方法是使用ADB,如下所示:
  1. adb shell dumpsys battery set level 42 - 将电池电量设置为42%
  2. adb shell dumpsys battery set ac 1 - 模拟设备连接到AC
  3. adb shell dumpsys battery set level 43 - 增加电池电量 - 触发 worker
使用模拟器电池状态UI也应该可以实现同样的效果,但我自己没有尝试过。

0

我曾经遇到过同样的问题,后来发现需要同时更改以下两个设置:

  • 充电器连接 改为
  • 电池状态 改为 未充电

如下图所示 enter image description here


小提示:

如果您使用setRequiresBatteryNotLow(true),除了降低电量,还需要将充电器连接设置为NONE


0

行为可能取决于您的操作系统级别。在较新的设备上(API 23及更高版本),即使连接了充电器,我们也可以确定电池是正在充电还是放电。在较旧的设备上,通过判断是否连接了充电器来确定是否正在充电。

如果您感兴趣,可以在此处查看详细行为:https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-master-dev/work/workmanager/src/main/java/androidx/work/impl/constraints/trackers/BatteryChargingTracker.java


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接