Android/Custom Framework

애플리케이션에서 사용자 정의 Framework Service 활용하기

임베디드 친구 2025. 5. 29. 21:43
728x90
반응형

애플리케이션에서 사용자 정의 Framework Service 활용하기

Android의 Framework Service는 시스템 수준에서 실행되는 서비스로, 애플리케이션이 시스템 리소스를 효과적으로 활용할 수 있도록 지원합니다. 이번 글에서는 애플리케이션에서 사용자 정의 Framework Service를 활용하는 방법을 설명하겠습니다. 특히 Context.getSystemService()를 사용하여 서비스에 접근하는 방법, Messenger 또는 AIDL을 활용한 클라이언트-서비스 통신, 그리고 Java/Kotlin을 사용한 예제 코드를 포함하여 실전 적용 방법을 알아보겠습니다.

1. 사용자 정의 Framework Service란?

Android의 Framework Service는 일반적인 Service와는 다르게 시스템 서비스로 등록되어 Android의 핵심 기능을 확장하는 역할을 합니다. 이를 통해 애플리케이션이 시스템 기능을 더욱 강력하게 활용할 수 있습니다.

사용자 정의 Framework Service를 만들면 시스템 내부에서 직접 관리되는 서비스로 동작하며, 이를 통해 앱과 서비스 간의 원활한 통신이 가능해집니다.

2. Context.getSystemService()를 이용한 서비스 접근

Android에서 제공하는 시스템 서비스는 Context.getSystemService()를 이용하여 접근할 수 있습니다. 사용자 정의 Framework Service도 동일한 방식으로 접근할 수 있도록 구현할 수 있습니다.

예제: 사용자 정의 서비스 접근하기

MyCustomService myService = (MyCustomService) context.getSystemService(Context.MY_CUSTOM_SERVICE);

이와 같이 getSystemService()를 통해 등록된 사용자 정의 서비스를 가져올 수 있습니다. 이를 위해서는 먼저 시스템 서비스로 등록해야 합니다.

3. Messenger 또는 AIDL을 이용한 클라이언트-서비스 통신

애플리케이션과 사용자 정의 Framework Service가 통신하는 방식에는 MessengerAIDL(Android Interface Definition Language) 두 가지가 대표적으로 사용됩니다.

3.1 Messenger를 이용한 통신

MessengerHandler를 기반으로 하는 간단한 IPC(Inter-Process Communication) 방식입니다.

서비스 측 코드 (Java)

public class MyCustomService extends Service {
    private final Messenger messenger = new Messenger(new IncomingHandler());

    private static class IncomingHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            // 클라이언트에서 받은 메시지 처리
            super.handleMessage(msg);
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        return messenger.getBinder();
    }
}

클라이언트 측 코드 (Java)

private ServiceConnection connection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        Messenger messenger = new Messenger(service);
        Message msg = Message.obtain(null, 1);
        try {
            messenger.send(msg);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {}
};

Messenger를 활용하면 간단한 메시지 기반의 통신을 할 수 있습니다.

3.2 AIDL을 이용한 통신

AIDL은 보다 강력한 인터페이스를 제공합니다. 특히 다중 프로세스 간 복잡한 데이터 전달이 필요한 경우 유용합니다.

AIDL 파일 정의 (IMyAidlService.aidl)

interface IMyAidlService {
    void sendData(String data);
}

서비스 측 코드 (Java)

public class MyAidlService extends Service {
    private final IMyAidlService.Stub binder = new IMyAidlService.Stub() {
        @Override
        public void sendData(String data) {
            Log.d("AIDL", "Received Data: " + data);
        }
    };

    @Override
    public IBinder onBind(Intent intent) {
        return binder;
    }
}

클라이언트 측 코드 (Java)

private IMyAidlService myAidlService;

private ServiceConnection connection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        myAidlService = IMyAidlService.Stub.asInterface(service);
        try {
            myAidlService.sendData("Hello AIDL");
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        myAidlService = null;
    }
};

4. 앱에서 사용자 정의 Framework Service 활용 예제 (Java/Kotlin)

사용자 정의 Framework Service를 활용하는 대표적인 방법으로, 애플리케이션에서 특정 기능을 수행하도록 연동할 수 있습니다.

예제: 앱에서 사용자 정의 서비스 활용 (Java)

public class MainActivity extends AppCompatActivity {
    private MyCustomService myService;

    private ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            myService = ((MyCustomService.LocalBinder) service).getService();
            myService.performCustomAction();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            myService = null;
        }
    };

    @Override
    protected void onStart() {
        super.onStart();
        Intent intent = new Intent(this, MyCustomService.class);
        bindService(intent, connection, Context.BIND_AUTO_CREATE);
    }
}

예제: 앱에서 사용자 정의 서비스 활용 (Kotlin)

class MainActivity : AppCompatActivity() {
    private var myService: MyCustomService? = null

    private val connection = object : ServiceConnection {
        override fun onServiceConnected(name: ComponentName, service: IBinder) {
            myService = (service as MyCustomService.LocalBinder).getService()
            myService?.performCustomAction()
        }

        override fun onServiceDisconnected(name: ComponentName) {
            myService = null
        }
    }

    override fun onStart() {
        super.onStart()
        val intent = Intent(this, MyCustomService::class.java)
        bindService(intent, connection, Context.BIND_AUTO_CREATE)
    }
}

결론

이번 포스팅에서는 애플리케이션에서 사용자 정의 Framework Service를 활용하는 방법을 살펴보았습니다. Context.getSystemService()를 사용하여 서비스에 접근하는 방법, MessengerAIDL을 활용한 클라이언트-서비스 통신, 그리고 Java/Kotlin을 활용한 서비스 연동 예제를 살펴보았습니다. 사용자 정의 Framework Service를 적절히 활용하면 Android 시스템과 긴밀하게 연동된 강력한 애플리케이션을 개발할 수 있습니다.

반응형