Title : Broadcast Receiver and Intent Basic
서로 다른 프로세스에서 동작하는 Service가 특정 이벤트가 발생했을 때, 그 정보를 앱으로 전달해야 할 필요가 있어
방법을 탐색하니 서로 다른 프로세스 간 통신(IPC)을 위한 선택지가 3가지 정도 있었다.
1. Messenger를 통한 Message 전달 후 Handler로 처리하는 방법
2. AIDL을 구현하는 방법
3. Intent를 전달하고, Broadcast Receiver로 수신 후 처리하는 방법
일반적으로 1번과 2번 방법은 프로세스 간 양방향 통신이 필요할 경우 채택한다고 한다.
현재 내가 필요한 기능 구현을 위해선 Service에서 App으로의 단방향 통신만 제공되면 되기에 3번 방법
Broadcast Receiver에 대해 찾아보았다.
Broadcast Receiver
브로드캐스트 리시버는 Intent를 사용하여 다양한 시스템 이벤트나 사용자 정의 이벤트를 수신하는 컴포넌트이다.
이때, 전달하는 Intent는 명시적 인텐트와 암시적 인텐트라는 것으로 구분되는데, 명시적 인텐트는 전달하고자 하는
대상. 즉, 이벤트를 수신해야 하는 패키지와 (브로드캐스트 리시버를 상속한)클래스를 지정해서 전달하는 것이고,
암시적 인텐트는 전달하는 대상을 지정하지 않고, 전역적으로 시스템을 방송하는 것이다.
내가 구현한 서비스 앱은 시스템 권한을 가졌기 때문에, 암시적 인텐트로 이벤트를 전달했더니, 보안과 관련된 에러 로그가
지속적으로 출력되어 명시적 인텐트를 사용해야 했다.
수신측
명시적 인텐트 방식으로 수신 받기 위해서는 Android Manifest 파일에 receiver 태그를 등록해야 한다.
<receiver android:name = "브로드 캐스트 리시버를 상속한 클래스 경로"/>
경로에 들어갈 클래스는 BroadcastReceiver 클래스를 상속한 클래스여야만 한다.
해당 클래스에서는 onReceive 함수를 오버라이드하여 특정 액션을 수신하였을 때, 어떻게 처리할 것인지에 대한
코드를 작성하면 수신측에서의 작업은 마무리된다.
public class MyReceiver extends BroadcastReceiver{
public final static String UserCustomAction = "com.intent.UserAction";
@Override
public void onReceive(Context context, Intent intent){
if(intent.getAction().equals(UserCustomAction)){
//사용자 정의 액션 수신 시 처리할 행동 작성
}
}
}
위 예제 코드는 내가 정의한 액션. 즉, 사용자 정의 액션을 수신하는 예시만 있지만, 보통 브로드 캐스트 리시버가
수신하는 액션(이벤트)들은 시스템에서 발생시키는 액션들로 몇 가지 예시만 첨부하도록 하겠다.
1. android.intent.action.BOOT_COMPLETED : 디바이스 부팅 완료 시 발생되는 액션
2. android.intent.action.BATTERY_LOW : 배터리 잔량이 일정 수준 이하가 됐을 때 발생되는 액션
3. android.intent.action.BATTERY_OKAY : 배터리 잔량이 일정 수준 이상이 됐을 때 발생되는 액션
시스템에서 발생시키는 이미 정의된 액션들을 수신하고 싶다면, 위 예제 코드에 if문만 추가하면 될 것이다.
송신측
수신측에서 준비가 완료되었으니 송신측에서는 인텐트를 전달하기만 하면 된다.
public class BroadcastSender {
public void sendBroadcast(Context context) {
Intent intent = new Intent();
intent.setAction("com.intent.UserAction");
intent.setClassName("com.example.receiverapp", "com.example.receiverapp.MyReceiver");
context.sendBroadcast(intent);
}
}
암시적 인텐트를 전달하는 것과 차이가 있다면, setClassName 함수를 통해 인텐트를 수신할 패키지와 클래스 경로를
지정한 다음 sendBroadcast 함수를 통해 전송한다는 것 정도이다.
단어 사전
[1]
Reference :
'2024.10~ > 일일 학습 노트' 카테고리의 다른 글
[2024-11-17] Fragment 기초 개념 다지기(with 깡쌤의 안드로이드 프로그래밍 with 자바) (0) | 2024.11.17 |
---|---|
[2024-11-04] 자바 입력 처리 방식 비교(2) (0) | 2024.11.05 |
[2024-11-04] 자바 입력 처리 방식 비교(1) (0) | 2024.11.04 |
[24.11.03] Android Service와 Messenger 기초 개념 다지기(1) (0) | 2024.11.03 |
[24.10.27] 컴파일러에 대한 기본기 다지기 (0) | 2024.10.27 |