[Andorid] Broadcast Receiver
Updated:
- 시스템이나 앱에서 이벤트 발생 시 broadcast를 해주는데, broadcast receiver를 이용하여 이런 이벤트를 처리
Receiving broadcasts
- 브로드 캐스트를 받는 두 가지 방법 : manifest-declared / context-registered
Manifest-declared receivers
- Manifest에
<receiver>
element 등록- intent filter로 구체적인 액션을 등록
<receiver android:name=".MyBroadcastReceiver" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.INPUT_METHOD_CHANGED" />
</intent-filter>
</receiver>
- 서브클래스
BroadcastReceiver
의onReceive(Context, Intent)
구현- 밑의 예제는 브로드캐스트의 내용을 로깅해보는 것
public class MyBroadcastReceiver extends BroadcastReceiver {
private static final String TAG = "MyBroadcastReceiver";
@Override
public void onReceive(Context context, Intent intent) {
StringBuilder sb = new StringBuilder();
sb.append("Action: " + intent.getAction() + "\n");
sb.append("URI: " + intent.toUri(Intent.URI_INTENT_SCHEME).toString() + "\n");
String log = sb.toString();
Log.d(TAG, log);
Toast.makeText(context, log, Toast.LENGTH_LONG).show();
}
}
Context-registered receivers
BroadcastReceiver
인스턴스 생성
BroadcastReceiver br = new MyBroadcastReceiver();
IntentFilter
생성,registerReceiver(BroadcastReceiver, IntentFilter)
호출하여 리시버 등록
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
this.registerReceiver(br, filter);
- Context-registered receivers 는 registering context가 유효한 경우만 broadcast receive
- ex) Activity에 등록을 했다면, Activity가 destroy되지 않는한 broadcast를 receive
- ex) Application context에 등록했다면 app이 실행중에는 항상 broadcast receive
- broadcast receive를 중단하고 싶다면
unregisterReceiver(android.content.BroadcastReceiver)
호출
Sending broadcasts
안드로이드는 broadcast를 보내는 세 방법을 제공:
sendOrderedBroadcast(Intent, String)
한 순간에 하나의 리시버에만 broacastsendBroadcast(Intent)
정해져있지 않은 순서로 모든 리시버에게 broadcast (Normal Broadcast)LocalBroadcastManager.sendBroadcast
sender와 같은 앱에 있는 리시버에게 broadcast
Intent intent = new Intent();
intent.setAction("com.example.broadcast.MY_NOTIFICATION");
intent.putExtra("data","Notice me senpai!");
sendBroadcast(intent);
- 브로드캐스트 메시지는 Intent 객체에 wrapped
- Intent 의 action 문자열은 java 패키지와 브로드캐스트 이벤트를 구분할 unique id를 제공해야 함
putExtra(String, Bundle)
을 사용해 추가적인 정보를 intent에 추가
Leave a comment