WorkManager约束(setRequiresCharging)在模拟器上不起作用

时间:2019-05-14 12:34:31

标签: java android android-emulator android-workmanager

我正在设置 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中,我希望充电器已连接,它可以在我的Samsung设备上使用,但不能在android仿真器上使用。

4 个答案:

答案 0 :(得分:0)

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

enter image description here

答案 1 :(得分: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

答案 2 :(得分:0)

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

  • Charger connectionNone
  • Battery statusNot Charging

正如下enter image description here


旁注:

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

答案 3 :(得分:0)

我发现,为了使条件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可以实现相同的目的,但我自己没有尝试过。