Android

[안드로이드/Recevier] 시스템 메시지 (System Message)

gangmini 2023. 4. 19. 23:07
반응형

시스템 메시지

  • 안드로이드는 단말기에서 사건이 발생할 경우 각 사건에 대해 정해진 메세지를 발생
  • 시스템 메세지 발생 -> 이에 반응하는 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 

 

암시적 브로드캐스트 예외  |  Android 개발자  |  Android Developers

백그라운드 제한에서 제외되는 암시적 브로드캐스트입니다.

developer.android.com

아래 예제는 애뮬레이터를 재부팅 할 때와 메시지를 수신할 때 안드로이드 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>

 

애뮬레이터에서 가상으로 전화나 문자 메시지를 보낼 수 있다!!

반응형