티스토리 뷰


BroadcastReceiver로 브로드캐스트 이벤트를 수신하자





어떤 이벤트가 발생한 사실을 앱에 알리고 싶을 때 BroadcastReceiver에 통지 합니다. 시스템의 이벤트를 앱에 알리거나, 앱간에 연계를 위해 이벤트를 알리고 싶을 때, 또는 소켓통신을 이용한 프로그램을 만들 때 이용합니다. 


기본을 이해하자 


BroadcastReceiver는 Intent를 받았을 때의 처리를 onReceive에서 구현합니다. 

어느 브로드캐스트 Intent를 받을지는 IntentFilter\fh wjddml gkqslek.


public abstract void OnReceive(Content content, Intent, intent);


두 번째 인수로 전달되는 Intent 는 Context.sendBroadcast() 등에서 보내진 브로드캐스트 Intent의 인스턴스 입니다. 

Intent.getAction() 을 호출해 액션이름을 가져오거나 추출합니다.

Intent.getExtras()를 호출해 Bundle을 가져오고 거기서 데이터를 추출 합니다. 또한 OnReceive()의 처리는 메인 스레드에서 수행되므로 처리에 시간이 걸려서는 안됩니다. 10초 이상이 걸리는 경우 ANR이 발생해 프로세스가 강제로 종료 됩니다. 


BroadcastReceiver 등록


BroadcastReceiver를 등록하는 방법은 2가지가 있습니다. 


1. 첫번째는 Androidmanifast.xml 에 receiver 태그를 등록하는 방법입니다.


<!-- Start the Service if application on boot -->

<receiver android:name=".BootReceiver">

<intent-filter>

<action android:name="android.intent.action.BOOT_COMPLETED" />

</intent-filter>

</receiver>


물론 퍼이션도 등록 해야 합니다. 


2. 두번째는 Context.registerReceiver를 이용해 실행 시 등록하는 방법입니다. 

실행 시 등록하는 했을 때는 해제도 직접 해줄 필요가 있습니다.

액티비티의 onResume 에서 등록했다면 onPause에서 unregisterReceive()를 호출해서 해제 합니다. 


샘플예제 

: 안드로이드 폰에서 음량이 변동되었을 때 리시버를 받아 보자 



여기서는 두번째 방법인 onResume 에서 리시버를 등록하고 onPause 에서 해제 해줍시다. 볼륨체크는 퍼미션 등록이 필요 없으므로 Androidmanifast 에 수정할 부분은 

없습니다. 


public class MainActivity extends AppCompatActivity {

private static final String VOLUME_CHANGED_ACTION =
"android.media.VOLUME_CHANGED_ACTION";
BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
intent.getExtras();
if (TextUtils.equals(action, VOLUME_CHANGED_ACTION)) {
Toast.makeText(MainActivity.this, "음량이 변화했습니다", Toast.LENGTH_SHORT).show();
}
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

}

@Override
protected void onResume() {
super.onResume();
IntentFilter intentFilter = new IntentFilter(VOLUME_CHANGED_ACTION);
registerReceiver(mReceiver, intentFilter);
}

@Override
protected void onPause() {
super.onPause();
unregisterReceiver(mReceiver);
}


onResume에서 리시버를 등록 했다면 obPause 에서 꼭 해제 할수 있도록 하자 


동작 모습 







공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함