반응형
시스템 메시지
- 안드로이드는 단말기에서 사건이 발생할 경우 각 사건에 대해 정해진 메세지를 발생
- 시스템 메세지 발생 -> 이에 반응하는 Broad Cast Recevier 동작
- 개발자가 각 사건에 대한 이름으로 Broad Cast Recevier 를 등록하면 OS가 찾아서 동작시키는 방식
- 안드 8.0 부터 사용할 수 있는 시스템 메시지 수 줄어들었음
- 안드 8.0 이상도 시스템 메시지를 발생시키는 Broad Cast Recevier 는 Manifest에 이름을 등록하여 사용이 가능
* 아래 공식문서에 나와 있는 Broad Cast Recevier 들은 Manifest에 등록하여 암묵적으로 사용이 가능 (안드 8.0 이상이여도 가능)
https://developer.android.com/guide/components/broadcast-exceptions?hl=ko
아래 예제는 애뮬레이터를 재부팅 할 때와 메시지를 수신할 때 안드로이드 OS 내장 리시버를 등록해 동작시키는 예제이다.
하지만 내 애뮬레이터 환경에서는 재부팅이 잘 되지 않아 재부팅 예제는 재현할 수 없었다. ㅠ.ㅠ -> 부팅이 안 되는건 아닌 것 같은데 토스트 메시지가 잘 나타나지 않음.....딱 한 번 나타났었는데 그 이후로는 잘 안 나옴. 아예 안 나온다기 보다는 뭔가 이미 사라진 걸 수도?...
class TestReceiver : BroadcastReceiver() {
// 안드 OS가 이 BroadcastReceiver를 실행하기 위해 찾으면 자동으로 호출되는 메서드
override fun onReceive(context: Context, intent: Intent) {
// This method is called when the BroadcastReceiver is receiving an Intent broadcast.
// BR의 이름으로 분기
when (intent.action) {
"android.intent.action.BOOT_COMPLETED" -> {
val ta = Toast.makeText(context,"부팅완료",Toast.LENGTH_SHORT)
ta.show()
}
"android.provider.Telephony.SMS_RECEIVED" -> { // 안드로이드 개발 지원 사이트 예제 코드
// 문자 메세지를 추출해서 텍스트뷰에 출력
if (intent.extras != null) {
val pduObject = intent.extras?.get("pdus") as Array<Any?>
if (pduObject != null) {
for (obj in pduObject) {
// 문자 메시지 양식 객체 추출
val format = intent.extras?.getString("format")
// 문자 메시지 객체 생성
val currentSMS = SmsMessage.createFromPdu(obj as ByteArray?, format) // 공식문서에서 지정한 예제 코드
// 메세지를 보낸 전화번호와 메시지 내용 출력
val showMessage = "전화번호 : ${currentSMS.displayOriginatingAddress}\n내용 : ${currentSMS.displayMessageBody}"
val t1 = Toast.makeText(context,showMessage,Toast.LENGTH_SHORT)
t1.show()
}
}
}
}
}
}
}
[* Manifest 에는 permssion 과 Receiver 이름을 추가해준다]
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <!--부팅 메세제 수신 권한 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/> <!-- 문자 메세제 수신 권한 -->
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<application
<receiver
android:name=".TestReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" /> <!--부팅이 완료가 되면 OS가 이 이름으로 등록된 리시버를 찾아 동작 -->
</intent-filter>
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" /> <!--부팅이 완료가 되면 OS가 이 이름으로 등록된 리시버를 찾아 동작 -->
</intent-filter>
</receiver>
</application>
반응형
'Android' 카테고리의 다른 글
[안드로이드/Service] IPC 란? (0) | 2023.04.20 |
---|---|
[안드로이드/Service] Service(서비스) 란? (0) | 2023.04.20 |
[안드로이드/Recevier] BroadCastReceiver 란? (0) | 2023.04.17 |
[안드로이드/Thread] RunOnUiThread (0) | 2023.04.17 |
[안드로이드/Thread] Handler를 사용한 화면 처리 (0) | 2023.04.17 |