안드로이드에서 백그라운드 작업을 효율적으로 관리하기 위해 WorkManager
와 JobScheduler
를 사용합니다. 두 가지 모두 주기적 또는 조건부로 실행해야 하는 작업을 처리하는 데 적합합니다. WorkManager
는 최신 API이며 더 많은 기능과 유연성을 제공합니다. 여기서는 두 가지 모두의 개념과 예제를 다루겠습니다.
1. WorkManager
개요
WorkManager
는 장기 실행 백그라운드 작업을 쉽게 예약하고 실행할 수 있는 라이브러리입니다. API 레벨 14 이상의 모든 안드로이드 버전에서 사용할 수 있으며, JobScheduler
, Firebase JobDispatcher
, AlarmManager
등의 기술을 내부적으로 사용하여 최적의 방식으로 작업을 처리합니다.
주요 특성
- 백그라운드 작업의 지속성 보장
- API 레벨 14 이상에서 작동
- 다양한 제약 조건 지원 (네트워크 상태, 배터리 상태 등)
- 체인 작업 (작업을 순차적으로 실행)
사용 예제
1. 종속성 추가
build.gradle
파일에 다음 종속성을 추가합니다.
dependencies { implementation "androidx.work:work-runtime:2.7.1" }
2. Work 클래스 생성
Work
클래스를 생성하여 백그라운드 작업을 정의합니다.
import android.content.Context; import androidx.annotation.NonNull; import androidx.work.Worker; import androidx.work.WorkerParameters; import android.util.Log; public class MyWorker extends Worker { private static final String TAG = "MyWorker"; public MyWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) { super(context, workerParams); } @NonNull @Override public Result doWork() { // 백그라운드 작업 수행 Log.d(TAG, "Work is being done"); // 작업이 성공적으로 완료되었음을 나타냄 return Result.success(); } }
3. Work 요청 만들기
작업 요청을 만들어 WorkManager에 전달합니다.
import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import androidx.work.OneTimeWorkRequest; import androidx.work.WorkManager; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 단일 작업 요청 생성 OneTimeWorkRequest workRequest = new OneTimeWorkRequest.Builder(MyWorker.class).build(); // WorkManager를 통해 작업 예약 WorkManager.getInstance(this).enqueue(workRequest); } }
2. JobScheduler
개요
JobScheduler
는 API 레벨 21(Lollipop) 이상에서 사용할 수 있는 백그라운드 작업 스케줄링 API입니다. 네트워크 상태, 충전 상태 등과 같은 다양한 조건에서 작업을 예약하고 실행할 수 있습니다.
주요 특성
- API 레벨 21 이상에서 사용 가능
- 다양한 조건에서 작업 예약 가능
- 시스템이 최적의 시기에 작업을 실행하여 배터리 수명 연장
사용 예제
1. JobService 클래스 생성
JobService
클래스를 생성하여 작업을 정의합니다.
import android.app.job.JobParameters; import android.app.job.JobService; import android.util.Log; public class MyJobService extends JobService { private static final String TAG = "MyJobService"; @Override public boolean onStartJob(JobParameters params) { // 백그라운드 작업 수행 Log.d(TAG, "Job started"); // 작업이 완료되었음을 알림 jobFinished(params, false); return true; // 작업이 아직 진행 중임을 나타냄 } @Override public boolean onStopJob(JobParameters params) { // 작업이 중단되었음을 나타냄 Log.d(TAG, "Job stopped"); return true; // 작업이 다시 시작되어야 함을 나타냄 } }
2. AndroidManifest.xml에 JobService 등록
<service android:name=".MyJobService" android:permission="android.permission.BIND_JOB_SERVICE"/>
3. Job 요청 만들기
작업 요청을 만들어 JobScheduler에 전달합니다.
import androidx.appcompat.app.AppCompatActivity; import android.app.job.JobInfo; import android.app.job.JobScheduler; import android.content.ComponentName; import android.os.Bundle; import android.os.Build; public class MainActivity extends AppCompatActivity { private static final int JOB_ID = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // JobInfo 객체 생성 ComponentName componentName = new ComponentName(this, MyJobService.class); JobInfo jobInfo = new JobInfo.Builder(JOB_ID, componentName) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) // 네트워크 연결 조건 설정 .setPersisted(true) // 재부팅 후에도 작업 유지 .build(); // JobScheduler를 통해 작업 예약 JobScheduler jobScheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE); jobScheduler.schedule(jobInfo); } } }
요약
- WorkManager: 더 유연하고 강력한 API로, 다양한 조건에서 백그라운드 작업을 예약하고 실행할 수 있으며, API 레벨 14 이상에서 사용할 수 있습니다. 네트워크 상태, 배터리 상태 등 다양한 제약 조건을 쉽게 설정할 수 있고, 체인 작업도 가능합니다.
- JobScheduler: API 레벨 21 이상에서 사용할 수 있는 백그라운드 작업 스케줄링 API로, 주로 조건부 작업을 예약할 때 사용합니다.
이 두 가지 API를 사용하여 안드로이드 애플리케이션에서 백그라운드 작업을 효율적으로 관리할 수 있습니다. WorkManager
는 최신 API이며 대부분의 경우에 더 적합하므로, 새로운 프로젝트에서는 WorkManager
를 사용하는 것이 좋습니다.