【问题标题】:WorkManager constraint (setRequiresCharging) doesn't work on emulatorWorkManager 约束(setRequiresCharging)在模拟器上不起作用
【发布时间】:2019-05-14 12:34:31
【问题描述】:

我正在使用约束设置 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 模拟器。

【问题讨论】:

  • 对我来说同样的问题,它不适用于模拟器,以及任何搭载 Android 10 或 11 的真实设备,包括 Pixel 4。在模拟器上,它似乎在充电水平时开始工作变化超过 90%。这并不是“setRequiresCharging”函数所承诺的。

标签: java android android-emulator android-workmanager


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    行为可能取决于您的操作系统级别。在较新的设备(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

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,我发现你必须同时更改:

      • Charger connectionNone
      • Battery statusNot Charging

      如下


      旁注:

      如果您使用setRequiresBatteryNotLow(true),除了降低Charge level 之外,您还必须将Charger connection 放入NONE

      【讨论】:

        【解决方案4】:

        我发现要使条件setRequiresCharging(true) 生效并触发doWork(),应该发生两件事:

        1. 设备(或本例中的模拟器)应插入(电源或 USB)
        2. 这是关键 - 电池电量应至少增加 1%

        实现此 IMO 的最简单方法是使用 ADB,如下所示:

        1. adb shell dumpsys battery set level 42 - 将电池电量设置为 42%
        2. adb shell dumpsys battery set ac 1 - 模拟插入交流电的设备
        3. adb shell dumpsys battery set level 43 - 提高电池电量 - 触发工作人员

        用模拟器电池状态UI应该可以实现同样的效果,但我自己没有尝试。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多