Android WorkManager

안드로이드에서 백그라운드 작업을 효율적으로 관리하기 위해 WorkManagerJobScheduler를 사용합니다. 두 가지 모두 주기적 또는 조건부로 실행해야 하는 작업을 처리하는 데 적합합니다. 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를 사용하는 것이 좋습니다.

Leave a Reply

Your email address will not be published. Required fields are marked *