안드로이드 서비스 바인딩 예제

바인딩된 서비스가 클라이언트와 다른 프로세스에서 실행될 수 있는 더 복잡한 시나리오에서는 메시지 처리기 또는 AIDL 스텁을 만들어야 합니다. 그러나 로컬 프로세스의 경우 매우 간단합니다. 바인딩된 서비스의 매우 일반적인 예는 JobScheduler API의 JobService 클래스입니다. JobService는 시스템에 바인딩되어 시스템에서 onStartJob과 같은 메서드를 호출할 수 있으며 작업이 실행이 중지되면 바인딩되지 않습니다. 이 게시물에서는 샘플 앱을 사용하여 바인딩된 서비스를 탐색합니다. 한 걸음 뒤로 물러서서 서비스가 무엇을 의미하는지 에 대한 더 큰 그림을 살펴 보겠습니다. Java 스레드 또는 실행기와 같은 백그라운드 스레드에서 실행되는 코드는 Android 구성 요소의 수명 주기에 실제로 바인딩되지 않습니다. 활동에 대해 생각하면 사용자 상호 작용에 따라 별도의 시작 및 종료 지점이 있습니다. 그러나 이러한 시작 및 종료 지점이 스레드의 수명 주기와 반드시 연결되는 것은 아닙니다. 바인딩된 서비스에서 메서드 호출을 할 수 있다는 것을 알았기 때문에 메서드 호출을 하기 위해 서비스에 대한 참조가 필요하다는 것은 매우 분명합니다. 따라서 첫 번째 단계는 서비스의 onBind 메서드를 구현하는 것입니다. 그런 다음 ServiceConnection 개체를 만들어야 하며 바인딩 구성 요소는 이를 사용하여 서비스에 바인딩합니다.

ServiceConnection 개체는 서비스를 구성 요소와 연결하고 서비스의 수명 주기는 해당 ServiceConnection에 바인딩됩니다. ServiceConnection를 구현할 때 서비스 연결 및 onServiceDisconnected와 같은 두 가지 메서드를 구현해야 합니다. onServiceConnected에서 서비스 참조를 초기화한 다음 서비스에 메서드를 호출할 수 있습니다. 주의: 서비스에 바인딩할 의도를 사용하는 경우 명시적 의도를 사용하여 앱이 안전한지 확인합니다. 암시적 의도를 사용하여 서비스를 시작하는 것은 의도에 응답할 서비스를 확신할 수 없고 사용자가 어떤 서비스가 시작되는지 알 수 없기 때문에 보안 위험이 있습니다. Android 5.0(API 수준 21)으로 시작하여 암시적 의도를 가진 bindService()를 호출하는 경우 시스템에서 예외를 throw합니다. 이 문서에서 다루지 않을 IntentService라는 자체 백그라운드 스레드를 처리하는 서비스의 하위 클래스가 있습니다. IBinder는 바인딩 하는 동안 클라이언트가 제공 해야 하는 ServiceConnection 인터페이스를 통해 클라이언트에 반환 됩니다.