我正在设置 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仿真器上使用。
答案 0 :(得分:0)
我刚刚尝试了codelab中的WorkManager示例(使用WorkManager v2.1.x),当我在仿真器上设置了正确的电池和充电状态时(我使用的是v29),它可以工作。 0.9-5537588):
答案 1 :(得分:0)
该行为可能取决于您的操作系统级别。在较新的设备(API 23及更高版本)上,即使连接了充电器,我们也可以确定电池是否正在充电或放电。在较旧的设备上,我们会根据是否连接了充电器来确定是否正在充电。
答案 2 :(得分:0)
我遇到了同样的问题,发现您必须同时更改两个:
Charger connection
至None
Battery status
至Not Charging
如果您使用setRequiresBatteryNotLow(true)
,则除了降低Charger connection
之外,还必须将NONE
放入Charge level
。
答案 3 :(得分:0)
我发现,为了使条件setRequiresCharging(true)
生效并触发doWork()
,应该发生两件事:
实现此IMO的最简单方法是使用ADB,如下所示:
adb shell dumpsys battery set level 42
-将电池电量设置为42%adb shell dumpsys battery set ac 1
-模拟插入交流电的设备adb shell dumpsys battery set level 43
-提高电池电量-触发工作人员使用模拟器电池状态UI可以实现相同的目的,但我自己没有尝试过。