2017-01-19 9 views
1

У меня есть service, который простирается JobService, как показано ниже:Android JobScheduler с требованием ожидания не уволят

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.

ответ

2

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

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

Job Scheduler not running on 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.