Things take time

[Android] 문자 수신 처리 (브로드캐스트 리시버, BroadcastReceiver) 2 : 동적 리시버 본문

Android(기능)

[Android] 문자 수신 처리 (브로드캐스트 리시버, BroadcastReceiver) 2 : 동적 리시버

겸손할 겸 2017. 8. 24. 16:33

[브로드캐스트 리시버]


안드로이드 4대 컴포넌트 중 하나, 문자 수신이나 배터리 상태, 디바이스 on/off에 대한 이벤트를 감지하여 처리할 수 있다.



[정적 vs 동적]


정적 리시버 : 일반적으로 매니페스트에 등록하고, 등록한 내용을 바탕으로 BroadcastReceiver를 상속받는 클래스를 사용한다.


동적 리시버 : 매니페스트나 다른 클래스를 생성할 필요 없이, 필요한 부분에서 직접 브로드캐스트리시버 클래스 객체를 생성하여 사용한다.



[사용 이유]


회원 가입 과정에서 문자 수신시, 해당 인증 문자를 자동적으로 입력해주는 함수가 있었으나(정적), 해당 소스를 또 다른 패키지명에서 똑같이 사용할 경우, 동일하게 세팅된 앱이 모두 실행되어 앱이 죽는 현상 발생


로직 : 회원 가입 시, 문자 발송 클릭하면 브로드캐스트 리시버를 등록한다 -> 문자가 발송된다 -> 처리 -> 처리 과정이 완료되면 브로드캐스트 리시버를 해제한다.

public void initReceiver(){ IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED"); receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.i("onReceive", "call"); } }; mContext.registerReceiver(receiver, intentFilter); } public void closeReceiver(){ mContext.unregisterReceiver(receiver); }

정적 리시버의 경우 매니페스트에 name을 통해 클래스 이름을, intent-filter를 통해 원하는 액션을 기록한다. 이 것을 코드화 시킨 것이 위의 소스

(물론 READ_SMS, RECEIVE_SMS, INTERNET 권한은 기본적으로 했음을 가정한다)