Android JobScheduler с требованием Idle не запускается

У меня есть service, который расширяет JobService, как показано ниже:

public class MyService extends JobService {
    private int notificationNumber = 0;

    private Thread thread;


    @Override
    public boolean onStartJob(JobParameters params) {
        Toast.makeText(this, "Service1 Started with JobId: " + params.getJobId(), Toast.LENGTH_LONG).show();
        thread = new WorkerThread(this, params);
        thread.start();
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        createNotification("Service1 onStop with JobId");
        return false;
    }

    public void createNotification(String msg) {
        notificationNumber++;
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
        builder.setContentText(msg);
        builder.setContentTitle("New Notification #" + notificationNumber);
        builder.setSmallIcon(R.mipmap.ic_launcher);
        builder.setAutoCancel(true);

        NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        Notification notification = builder.build();
        manager.notify(notificationNumber, notification);
    }

}

class WorkerThread extends Thread {
    private MyService service;
    private JobParameters params;
    public WorkerThread(MyService service, JobParameters params) {
        this.service = service;
        this.params = params;
    }

    @Override
    public void run() {
        try {
            service.createNotification("Service1.WorkerThread Started");
            Thread.sleep(10000);

            service.createNotification("Service1.WorkerThread Finished");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            Log.i("##########", "Job Finished");
            service.jobFinished(params, false);
        }
    }
}

и используя JobInfo.builder, я создаю экземпляр из этого и запускаю его с помощью JobScheduler, как показано ниже:

public void scheduleService() {
        int JOB_ID =1;
        long y=100;
        ComponentName serviceName = new ComponentName(this, MyService.class);
        JobInfo jobInfo = new JobInfo.Builder(JOB_ID, serviceName)
//                .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
//                .setBackoffCriteria(y,JobInfo.BACKOFF_POLICY_LINEAR)
                .setPeriodic(y)
                .setRequiresDeviceIdle(true)
                .build();
        JobScheduler scheduler = (JobScheduler) this.getSystemService(Context.JOB_SCHEDULER_SERVICE);
        int result = scheduler.schedule(jobInfo);
        if (result == JobScheduler.RESULT_SUCCESS) {
            Log.d("Test", "Job scheduled successfully!");
        }
    }

даже когда я использую:

        JobInfo jobInfo = new JobInfo.Builder(JOB_ID, serviceName)
//                .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
//                .setBackoffCriteria(y,JobInfo.BACKOFF_POLICY_LINEAR)
                .setPeriodic(y)
//                .setRequiresDeviceIdle(true)
                .build();

ничего не работает. Хотя это:

if (result == JobScheduler.RESULT_SUCCESS) {
        Log.d("Test", "Job scheduled successfully!");
    }

показывает, что задание запланировано правильно, но даже 1 линия службы не вызывается! Есть идеи?

И про манифест:

       <service
        android:name=".MyService"
        android:enabled="true"
        android:permission="android.permission.BIND_JOB_SERVICE"
        android:exported="true"></service>

Вроде все правильно!!!

===========Редактирование без требования простоя срабатывает, но спустя долгое время.

TG.


person ConductedClever    schedule 19.01.2017    source источник


Ответы (1)


Наконец я нашел причину. Все было хорошо, но минимальное время.

Я нашел ответ на свой вопрос здесь:

Планировщик заданий не работает на Android N

Как вы видите здесь, минимальное время для планирования составляет около 15 минут. Я оставил телефон на 15 минут в режиме ожидания, и он сгорел.

Соответствующий журнал, который меня не заботил, был таким:

01-19 22:39:01.775 31125-31125/ir.cclever.prepareforclass W/JobInfo: Specified interval for 114 is +10ms. Clamped to +15m0s0ms

Я хочу, чтобы этот пост помог другим, столкнувшимся с этой проблемой.

TG.

person ConductedClever    schedule 20.01.2017