안드로이드 잡스케줄러 주의점

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 폴더에 있고, 웹에서는 여기서 코드를 확인할 수 있다.

참고

“안드로이드 잡스케줄러 주의점”에 대한 1개의 생각

  1. 핑백: 안드로이드 잡 서비스 분석 – Dog발자

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.