targetSdk를 24 이상으로 지정한 앱은 안드로이드의 정책 변경에 따라 더 이상 CONNECTIVITY_ACTION을 전달받지 못한다. 그러므로, CONNECTIVITY_ACTION을 통해 정기적으로 백그라운드 작업을 시작하고 있었다면 이제 잡스케줄러를 이용해야 한다.
여기서는, 브로드캐스트 리시버 대신 잡스케줄러로 변경 시 꼭 확인해야할 부분들만 골라 살펴보겠다.
1.
CONNECTIVITY_ACTION 브로드캐스트 리시버를 대신해 잡을 등록하자. 앱이 시작될 때, 아래 예제처럼 잡을 등록한다.
JobInfo jobInfo = new JobInfo.Builder(JOB_ID, new ComponentName(this, MyJobService.class)) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) .setPeriodic(DateUtils.MINUTE_IN_MILLIS * 30) .setPersisted(true) .build(); jobScheduler.schedule(jobInfo);
위 예제 코드 속 잡(Job)은 아래와 같은 조건으로 실행된다.
- WiFi를 사용할 수 있게 되었을 때( NETWORK_TYPE_UNMETERED )
- 30분 마다 반복적( DateUtils.MINUTE_IN_MILLIS * 30 )
- 단말을 재부팅해도 잡 유지( persisted = true )
JobInfo.setPersisted(true)로 선언했으므로 RECEIVE_BOOT_COMPLETED 퍼미션을 AndroidManifest.xml에 추가해야 한다. 선언하지 않으면, 예외가 발생한다.
2.
AndroidManifest.xml에 잡 서비스(JobService) 컴포넌트 추가시 퍼미션을 선언해야 한다.
<service android:name=".service.MyJobService" android:exported="true" android:permission="android.permission.BIND_JOB_SERVICE" />
퍼미션을 선언하지 않으면, 시스템에서 무시하고 처리하지 않는다.
O OS 기준으로는 java.lang.IllegalArgumentException가 발생한다.
3.
잡서비스 내의 onStartJob()의 리턴 값이 true여야 한다. false를 반환하면 잡을 다시 실행 할 필요가 없다는 뜻으로 잡스케줄러 내의 잡이 다시 실행되지 않고 종료될 것이다.
@Override public boolean onStartJob(JobParameters params) { ... return true; }
위 세 가지만 주의하면, 돌아가는 잡을 만들 수 있다.
그 밖에
- 2014년 Google I/O에서 잡스케줄러에 대해 소개한 5분 짜리 영상이 있으니 참고하자.
- 공식 샘플은 [sdk]samplesandroid-*backgroundJobScheduler 폴더에 있고, 웹에서는 여기서 코드를 확인할 수 있다.
참고
- https://developer.android.com/about/versions/nougat/android-7.0-changes.html?hl=ko#bg-opt
- http://gdgand.github.io/lollipop/2015/03/12/lollipop.html
- https://developer.android.com/samples/JobScheduler/index.html
- http://stackoverflow.com/questions/29653885/android-jobscheduler-cant-create-a-persistent-job
- https://www.youtube.com/watch?v=QdINLG5QrJc
- https://developer.android.com/reference/android/app/job/JobInfo.Builder.html#setPersisted(boolean)
- https://developer.android.com/reference/android/app/job/JobService.html#PERMISSION_BIND
핑백: 안드로이드 잡 서비스 분석 – Dog발자