안드로이드 개발 서비스(Service) 컴포넌트 예제 구현하는 방법

 

환경: Android Studio

 

안드로이드에는 크게 4개의 컴포넌트로 나눕니다. 그 중 하나가 서비스(Service) 입니다. 서비스는 안드로이드 OS 에서 백그라운드로 돌아가는 객체 입니다. 실행과 종료는 Activity 에서 하겠죠. 주로 주기적인 관찰과 피드백이 필요한 기능에 사용합니다. 안드로이드 사용량 모니터링이나 브로드캐스트 서버로부터 수신한 데이터를 알리는 등의 기능을 수행합니다. 자신의 스마트폰을 열어서 애플리케이션 관리자로 들어가 보세요. 실행중인 앱들은 전부 서비스 기능을 수행하고 있는 것입니다.

 

먼저 자신이 사용할 서비스 클래스를 만들어야 합니다. 상속은 Service 클래스를 받습니다. 기본적으로 4개의 함수를 구현해야 합니다. 함수의 이름을 통해서 어떤 역할을 하는지 짐작이 갈 겁니다. Activity 에서 서비스를 실행하는 onStartCommand(), 종료하면 onDestory() 함수가 실행됩니다. 이것은 가장 기본적인 형태입니다.

public class PhoneCallService extends Service {
    @Override
    public IBinder onBind(Intent intent) {
        // Service 객체와 화면 Activity 사이에서 데이터를 주고받을 때
        // 데이터를 전달할 필요가 없으면 return null;
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "서비스 시작");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        Log.d(TAG, "서비스 종료");
        super.onDestroy();
    }
}

 

Activity 에서 서비스 실행과 종료를 위한 버튼을 두 개 만들었습니다. 서비스를 실행하는 startService(), 종료할 때 stopService() 함수를 호출합니다. 두 함수 모두 Context 를 상속받아 만든 ContextWrapper 에 포함되어 있습니다. 그림처럼 Activity ContextWrapper 를 상속받아 만들었기 때문에 함수를 바로 사용할 수 있습니다.

안드로이드 개발 서비스(Service) 컴포넌트 예제 구현하는 방법

public class PhoneCallActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_phone_call);

        Button btnStart = (Button) findViewById(R.id.btn_service_start);
        Button btnEnd = (Button) findViewById(R.id.btn_service_end);

        btnStart.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // 서비스 시작하기
                Intent intent = new Intent(
                        getApplicationContext(),// Activiey Context
                        PhoneCallService.class); // 이동할 서비스 객체
                startService(intent); // 서비스 시작
            }
        });

        btnEnd.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // 서비스 종료하기
                Intent intent = new Intent(
                        getApplicationContext(),// Activiey Context
                        PhoneCallService.class); // 이동할 서비스 객체
                stopService(intent); // 서비스 종료
            }
        });
    }
}


activity_phone_call.xml : 화면을 구성하는 XML 입니다

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/btn_service_start"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="서비스 시작" />

    <Button
        android:id="@+id/btn_service_end"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="서비스 종료" />
</LinearLayout>

 

다음은 AndroidManifest.xml Service 를 등록해야 합니다. 위치는 <application> 태그 안입니다

<application
    android:name=".CustomApplication"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".PhoneCallActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <service android:name=".PhoneCallService" />
</application>

 

Activity 를 실행해서 서비스 시작과 종료 버튼을 클릭해 보세요. 서비스 내부에 추가한 콘솔 출력 함수인 Log.d() 를 통해서 이상 없이 수행되고 있음을 알 수 있습니다. 다음 포스팅에서는 Service Bind 구현해 보겠습니다. Bind Activity Service 간에 데이터를 주고 받을 수 있는 인터페이스 입니다. 백그라운드에서 돌아가는 Service 를 제어하고 결과값을 받아 처리하기 위해서는 반드시 알아야 할 기능입니다

안드로이드 개발 서비스(Service) 컴포넌트 예제 구현하는 방법

Posted by 녹두장군