0

我正在学习如何使用 JobScheduler。如 onresume 方法所示,我设置了执行作业要满足的条件,作业将在设备不充电时调度,无论设备是否空闲,作业将每 7 秒执行一次。

在运行时,USB线连接到设备以安装应用程序,这意味着设备正在充电,因此安装应用程序后作业尚未开始,因为设备正在充电,但在我拔下USB线后我执行了要执行的工作,但发生的事情是工作从未开始,我不明白为什么

请让我知道为什么会发生这种行为,并请让我知道以下问题的答案,这将有助于我更好地理解 jobScheduler:

Q: 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());
}

}

工作服务

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;
}

}

4

2 回答 2

0

setRequiresCharging(false) 是否意味着只有在设备不充电时才会执行任务,还是意味着无论设备是否正在充电都将执行任务?

文档中:

指定要运行此作业,需要插入设备。默认为 false。

换句话说,如果您希望您的工作仅在设备充电时的条件下运行 - 您应该通过true. 默认为false,这意味着充电标准被忽略,即无论设备是否正在充电(假设满足其他标准),您的工作都将被执行。

您可以通过JobScheduler.schedule(JobInfo job)返回的int值检查您的作业是否已成功启动。它将返回RESULT_SUCCESSRESULT_FAILURE

于 2017-03-25T22:26:59.163 回答
-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();
于 2018-05-10T07:17:45.840 回答