我正在学习如何使用JobScheduler。如onresume方法所示,我设置要满足的条件以执行作业, 当设备未充电时,将安排作业,无论设备是否空闲,作业都将被执行 7秒。
在运行时,usb线连接到设备以便安装App,这意味着设备正在充电,所以在运行之后 安装应用程序作业尚未启动,因为设备正在充电,但在我拔掉usb电缆后,我执行了这项工作 被执行但发生的事情是工作从未开始,我无法理解为什么
请让我知道为什么会发生这种行为,请让我知道以下问题的答案,这将有助于我 更好地了解jobScheduler:
问:setRequiresCharging(false)表示只有在设备不充电时才会执行任务,或者意味着 无论设备是否正在充电,任务都将被执行?
主要活动
public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
private static int jobId = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.w(TAG, "onCreate");
setContentView(R.layout.activity_main);
}
@Override
protected void onResume() {
super.onResume();
Log.w(TAG, "onResume");
ComponentName serviceComponent = new ComponentName(this, MyJobService.class);
JobInfo.Builder builder = new JobInfo.Builder(jobId, serviceComponent);
builder.setRequiresCharging(false);
builder.setRequiresDeviceIdle(false);
builder.setPeriodic(7 * 1000);
JobScheduler jobScheduler = (JobScheduler) getApplication().getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(builder.build());
}
}
jobService :
package example.com.jobscheduler_00;
public class MyJobService extends JobService {
private static final String TAG = MyJobService.class.getSimpleName();
@Override
public boolean onStartJob(JobParameters params) {
Log.w(TAG, "onStartJob JobId: " + params.getJobId());
Toast.makeText(this, "onStartJob JobId:" + params.getJobId(), Toast.LENGTH_SHORT).show();
jobFinished(params, false);
return true;
}
@Override
public boolean onStopJob(JobParameters params) {
Log.w(TAG, "onStopJob");
Toast.makeText(this, "onStopJob JobId:" + params.getJobId(), Toast.LENGTH_SHORT).show();
return true;
}
}
答案 0 :(得分:0)
setRequiresCharging(false)是否意味着,只有当设备没有充电时才会执行任务,或者无论设备是否正在充电,都意味着任务将被执行?
指定要运行此作业,需要插入设备。默认为false。
换句话说,如果您希望您的作业仅在条件下运行,那么当设备正在充电时 - 您应该通过true
。默认情况下,它是false
,这意味着不考虑收费标准,即无论设备是否正在收费,您的工作都将被执行(假设其他标准已满足)。
您可以通过JobScheduler.schedule(JobInfo job)返回的 int 值检查您的作业是否已成功启动。它将返回RESULT_SUCCESS或RESULT_FAILURE。
答案 1 :(得分:-1)
新的WorkManager API将帮助您为要安排的任务设置必要的约束。
请观看此视频,了解简要介绍 - https://www.youtube.com/watch?v=pErTyQpA390(WorkManager于21:44)。
编辑:添加一个示例以展示新API的功能
例如:
您可以设置与此类设备的充电状态相关的约束(以及其他约束,例如,如果设备应该为运行任务而空闲等等)。
// Create a Constraints that defines when the task should run
Constraints yourConstraints = new Constraints.Builder()
.setRequiresDeviceIdle(true/false)
.setRequiresCharging(true/false)
// Many other constraints are available
.build();
// ...then create a OneTimeWorkRequest that uses those constraints
OneTimeWorkRequest yourWork =
new OneTimeWorkRequest.Builder(YourWorkerClass.class)
.setConstraints(yourConstraints)
.build();