Как запланировать работу с помощью Jobscheduler

Я учусь использовать JobScheduler. как показано в методе onresume, я устанавливаю критерии, которые должны быть соблюдены для выполнения задания, задание будет запланировано, когда устройство не заряжается, независимо от того, простаивает устройство или нет, и задание будет выполняться каждые 7 секунд.

во время выполнения USB-кабель подключен к устройству для установки приложения, что означает, что устройство заряжается, поэтому после установки приложения задание не началось, потому что устройство заряжается, но после того, как я отключил 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());
}

}

служба работы:

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

}


person user2121    schedule 25.03.2017    source источник
comment
и задание будет выполняться каждые 7 секунд — минимальный период на Android 7.0+ составляет 15 минут. Минимальный период на Android 5.0-6.0 не помню, но удивлюсь, если меньше минуты.   -  person CommonsWare    schedule 26.03.2017
comment
спасибо, сэр.. но, как вы сказали, я не помню минимальный период на Android 5.0-6.0.. есть ли другая альтернатива?   -  person user2121    schedule 26.03.2017


Ответы (2)


SetRequiresCharging(false) означает, что задача будет выполняться, только если устройство НЕ заряжается, или это означает, что задача будет выполняться независимо от того, заряжается устройство или нет?

Из документации:

Укажите, что для запуска этого задания устройство должно быть подключено к сети. По умолчанию установлено значение false.

Другими словами, если вы хотите, чтобы ваша работа запускалась только в состоянии, когда устройство заряжается - вы должны передать true. По умолчанию это false, что означает, что критерии зарядки не учитываются, т. е. ваше задание будет выполняться независимо от того, заряжается устройство или нет (при условии, что другие критерии выполнены).

Вы можете проверить, успешно ли запущено ваше задание, по значению int, которое JobScheduler.schedule(JobInfo job) возвращает. Он вернет либо RESULT_SUCCESS, либо RESULT_FAILURE.

person azizbekian    schedule 25.03.2017
comment
а не могли бы вы сказать мне, почему после отключения USB-кабеля запланированное задание не начинается сразу?? - person user2121; 26.03.2017
comment
Система увольняет вашу работу, когда находит для этого удобное время. Если вам нужна точность, вы должны использовать AlarmManager. - person azizbekian; 26.03.2017

Новый API WorkManager поможет вам установить необходимые ограничения для задачи, которую вы хотите расписание.

Взгляните на это видео для краткого введения - 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();
person Annsh Singh    schedule 10.05.2018
comment
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. – Из обзора - person mlinth; 10.05.2018
comment
@mlinth Спасибо за обзор. Позвольте мне добавить к моему ответу, чтобы улучшить его. - person Annsh Singh; 10.05.2018