안녕하세요.
오늘 포스팅 내용은 최근 제가 2개의 앱을 상호작용하면서 활용한 2개의 방법 중 하나인 BroadcasetReceiver 에 대해서 정리하겠습니다.
BroadcasetReceiver 란 4대 컴포넌트 중 하나로 android 시스템이나 특정 이벤트 발생시 수신 후 반응하는 요소입니다.
생명주기는 onReceive() 함수 하나이며 호출을 수신했을때 짧게 동작하며 만약 BroadcasetReceiver 내부 동작이 오래 걸릴 경우 오류가 발생할수있으므로 긴 작업은 다음에 포스팅할 BoundService를 사용하는 것이 좋을거라 생각됩니다.
그럼 순차적으로 사용 방법에 대해서 알아보겠습니다.
1. Manifest 등록
먼저 Manifest에 아래와 같이 추가해줍니다. 이때 intent filter 내부의 action name의 경우 호출할때 사용해야하므로 다른 앱에서도 해당 이름을 알고있어야 합니다.
<receiver android:name=".receiver.MyBroadCastReceiver" android:exported="true">
<intent-filter>
<action android:name="com.example.test.broadcastreceiver.action"></action>
</intent-filter>
</receiver>
2. BroadcastReceiver Class
호출시 동작할 BroadcasetReceiver 기본 틀은 아래와 같습니다. onReceive 내부에 동작들을 하고 종료시 호출된 부분은 종료됩니다. 이때 intent를 활용하여 호출시 포함시킨 정보를 가지고 와서 활용할수 있습니다.
class MyBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
//todo
val info = intent?.getStringExtra("String")
}
}
3. 리시버 호출 방법
다른 앱에서 위 BroadcasetReceiver 를 호출하는 방법은 아래와 같습니다.
intent를 생성하여 위 manifest의 action name 항목에 추가한 string 값을 넣어줍니다.
이후 전달하고자 하는 값들을 put 해주고 sendBroadcst 를 통해서 위 BroadcastReceiver를 호출할 수 있습니다.
val intent: Intent = Intent("action_name")
intent.putExtra("String", "result")
sendBroadcast(intent)
이러한 방식으로 다른앱의 리시버를 호출시 조건은 두개의 앱이 실행되어있는 상태여야 한다는 점입니다.
그래서 저는 상호작용 전에 BoundService를 통해서 리시버가 있는 앱이 background에 있는지 여부를 체크하는 로직을 Application class에 추가하여 체크하는 방식을 사용하였습니다.
그럼 만약 리시버를 호출한 앱이 리시버 동작 후 그 결과를 받고싶다면 무슨 방법이 있을까요?
저는 동일하게 리시버를 호출한 앱에도 동적으로 receiver를 생성하여 그 결과를 받아오도록 하였습니다. 이렇게 할경우 프로젝트의 여러 activity가 있을거고 그 activity 들의 공통 동작을 짜는 BaseActivity를 만들었을때 여기서 생성하고 필요한 곳에서 사용하도록 쉽게 처리할 수 있었습니다.
4. 동적으로 리시버 생성 방법
아래 코드처럼 동적으로 receiver를 생성할 수 있습니다. 이렇게 생성할 경우 필요한 타이밍 혹인 component 생성시 registerReceiver 함수를 통해서 receiver와 intent를 같이 추가하면 등록됩니다.
이렇게 사용할 경우 반드시 메모리 관리를 위해 onDestroy 혹은 안쓰는 타이밍에 unregisterReceiver(receiver) 도 해주시면 되겠습니다.
private lateinit var receiver: BroadcastReceiver
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
todo
}
}
val intentFilter = IntentFilter("action_name")
registerReceiver(receiver, intentFilter)
}
override fun onDestroy() {
super.onDestroy()
// 리시버 해제
unregisterReceiver(receiver)
}
이러한 방식으로 저는 백그라운드에 있는 앱의 기능 하나 혹은 정보 하나를 호출할 필요가 있을 경우 BroadcastReceiver를 사용하였습니다.
구조만 보다면 아래 구조로
sendCommandToAnalyzer 함수는 내부에 action name을 적도록 하여 원하는 리시버를 호출하도록 하였고 Background에 있는 앱은 해당 action name에 맞는 리시버가 동작하여 onReceive에 특정 동작 혹은 결과값을 다시 intent에 담아서 메인 앱에 전달하도록 합니다.
그럼 메인앱은 위 코드처럼 동적으로 생성한 리시버에서 그 값을 intent를 통해 받아오도록 하였습니다.

아직 정리가 미흡하지만 끝까지 읽어주셔서 감사합니다.
'안드로이드 > component' 카테고리의 다른 글
| [앱 상호작용]Bound Service를 사용하여 2개 앱 상호작용 (Java) (0) | 2025.09.15 |
|---|