2017-01-19 4 views
1

I가 아래 JobService를 확장하는 service :안드로이드 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); 
     } 
    } 
} 

나는 그에서 인스턴스화하고 아래와 같이 JobScheduler에 의해 실행 얻을 JobInfo.builder를 사용하여 :

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

마지막으로 이유를 발견했습니다. 모든 것은 ok이었다. 그러나 최소의 시간.

나는 여기에 내 질문의 답변을 발견

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.