상세 컨텐츠

본문 제목

[안드로이드]JobService 스케쥴작업 만들어보기

안드로이드

by aries574 2020. 12. 15. 12:20

본문


2020/12/14 - [안드로이드] - [안드로이드]ProgressBar(상태바) 반복 AsyncTask 만들어보기

 

이번 시간에는 일정 시간마다 사용자가 원하는 작업을 자동으로

돌아가게 하는 스케쥴작업을 만들어보겠습니다.

안드로이드에서는 JobSerivce를 지원하고 있습니다. 

 

1. 권한구현(manifests -> AndroidManifest.xml)

application태그 위에 권한을 추가합니다. 

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

 

2. 서비스구현(ExamJobService.java)

 


import android.app.job.JobParameters;
import android.app.job.JobService;
import android.util.Log;

public class ExamJobService extends JobService {

    private static final String TAG = "ExamJobService";
    private boolean jobCancelled = false;

    //서비스 시작
    @Override
    public boolean onStartJob(JobParameters params) {
        Log.d(TAG, "onStartJob");

        doBackgroundWork(params);
        return true;
    }

    //서비스 중지
    @Override
    public boolean onStopJob(JobParameters params) {
        Log.d(TAG, "onStopJob");
        jobCancelled = true;
        return true;
    }

    private void doBackgroundWork(final JobParameters params){
        new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i = 0; i < 10; i++){
                    Log.d(TAG, "run: " + i);
                    if(jobCancelled){
                        return;
                    }
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                Log.d(TAG, "Job finished");
                jobFinished(params, false);
            }

        }).start();
    }
}

 

3. 서비스 선언(manifests -> AndroidManifest.xml)

서비스를 사용하기 위해서는 AndroidManifest에 서비스를 선언해야 한다.

application태그 안에 선언합니다.

<service android:name=".ExamJobService"
    android:permission="android.permission.BIND_JOB_SERVICE"/>

 

4. 메인 화면 구현(activity_main.xml)

간단하게 버튼 2개를 만듭니다. 하나는 스케줄 작업 시작, 하나는 스케쥴작업 취소

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/start_schedule"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@id/cancel_schedule"
        android:layout_centerHorizontal="true"
        android:text="Start Job" />

    <Button

        android:id="@+id/cancel_schedule"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_centerHorizontal="true"
        android:text="Cancel Job" />
</RelativeLayout>

 

5. 메인 기능 구현(MainActivity.java)

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.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button startBtn = findViewById(R.id.start_schedule);
        final Button cancelBtn = findViewById(R.id.cancel_schedule);

        startBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                scheduleJob(v);
            }
        });

        cancelBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                cancelJob(v);
            }
        });
    }

    //스케쥴 시작
    public void scheduleJob(View v){
        ComponentName componentName = new ComponentName(this, ExamJobService.class);

        //작업설정
        JobInfo info = new JobInfo.Builder(123, componentName)
                .setRequiresCharging(true) //충전중일 때
                .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)//네트워크 상태 설정
                .setPersisted(true)
                .setPeriodic(15 * 60 * 1000) //15분(주기적) 최소기준이 15분(1000 = 1초)
                .build();

        //setPeriodic 부팅 후 작업 실행여부설정 RECEIVE_BOOT_COMPLETED 권한설정해야함
        //setMinimumLatency(TimeUnit.MINUTES.toMillis(1))1분 //얼마후에 실행되어야 하는지(한번만)
        //NETWORK_TYPE_UNMETERED WIFI
        //NETWORK_TYPE_CELLULAR 셀룰러
        //NETWORK_TYPE_ANY 언제든
        //NETWORK_TYPE_NONE 인터넷 연결 안되었을때

        JobScheduler jobScheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);

        //작업결과값
        int resultCode = jobScheduler.schedule(info);
        if(resultCode == jobScheduler.RESULT_SUCCESS){
            Log.d(TAG, "작업 성공");
        }else{
            Log.d(TAG, "작업 실패");
        }
    }

    //스케쥴 취소
    public void cancelJob(View v){
        JobScheduler scheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
        scheduler.cancel(123);
        Log.d(TAG, "작업 취소");
    }
}

 

6. 실행화면

 

반응형

관련글 더보기

댓글 영역