브로드캐스트 리시버, 컨텐트 리졸버

하이솝·2026년 5월 30일

학습목표

  • 브로드캐스트 리시버의 개념을 이해하고 사용할 수 있다.
  • 컨텐트 프로바이더와 리졸버 개념을 이해하고 컨텐트 리졸버를 사용할 수 있다.
  • 다중 동적 권한 요청을 이해하고 사용할 수 있다.

브로드캐스트 리시버(Broadcast Receiver)

시스템이나 다른 앱이 방송하는 메시지를 받는 리시버

시스템 이벤트시 방송

  • 시스템 부트 완료, 충전 시작, 네트워크 연결 변경, 문자 수신 등의 이벤트
  • 문자 수신과 같은 민감한 정보는 권한을 필요로 함

사용 방법

  • BroadcastReceiver 상속한 클래스, onReceive() 재정의
  • ContextCompat.registerReceiver()로 1번의 클래스 객체 등록
    이 때 수신할 방송 종류를 IntentFilter로 정의하여 포함
    앱이 보내는 방송을 수신은 ContextCompat.RECEIVER_EXPORTED 플래그 설정
    더 이상 수신 할 필요가 없을 때 unregisterReceiver() 호출

BroadcastReceiver 클래스 상속

onReceive() 재정의

class MyBroadcastReceiver(private val onReceiveMessage:
(String, String) -> Unit) : BroadcastReceiver() {
	override fun onReceive(context: Context?, intent: Intent?) { ... }
}

수신자 등록/해지, 수신자에게서 메시지 받는 콜백

private fun startBroadcastReceiver() {
	IntentFilter().also {
    	it.addAction(Intent.ACTION_POWER_CONNECTED)
        it.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED)
    	it.addAction(Telephony.Sms.Intents.SMS_RECEIVED_ACTION) // 권한 필요
		ContextCompat.registerReceiver(this, broadcastReceiver, it, ContextCompat.RECEIVER_EXPORTED)
    }
}
override fun onStart() {
	super.onStart()
    startBroadcastReceiver()
}
override fun onStop() {
	super.onStop()
    unregisterReceiver(broadcastReceiver)
}

필요한 권한 등록, 동적 권한 요청

Telephony.Sms.Intents.SMS_RECEIVED_ACTION에 필요한 권한

AndroidManifest.xml에 권한 표시

<uses-feature android:name=
	"android.hardware.telephony" android:required="false" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />

동적 권한 요청

  • 1개 권한 요청
rememberLauncherForActivityResult(
	contract = ActivityResultContracts.RequestPermission(),
    onResult = 결과 받을 람다
).launch(요청할 권한)
  • 2개 이상 권한 요청
rememberLauncherForActivityResult(
	contract = ActivityResultContracts.RequestMultiplePermission(),
    onResult = 결과 받을 람다
).launch(요청할 권한들의 배열)

Content Provider / Resolver

  • 안드로이드에서 다른 앱에 데이터를 제공해주기 위해 표준화된 인터페이스
    적절한 데이터 은닉과 보호 기능 제공

Content Resolver

  • Content Provider에 접근하기 위한 방법
  • CRUD - Create, Retrieve, Update, Delete 기능 제공
  • Content Provider에 따라 접근 권한이 필요한 경우가 있음
    CallLog:READ_CALL_LOG

사용 방법(데이터 읽기, Retrieve)

  • 1) Context에서 ContentResolver 객체 가져오기
  • 2) query로 컨텐츠 URI와 조건 등을 명시해서 실행, cursor 리턴
    Create, Update, Delete의 경우, query 대신 insert, update delete 사용
  • 3) cursor를 사용하여 데이터 읽기

Content URI

  • query, insert, update, delete 모두 첫 번째 인자가 Content URI
  • Content URI는 접근하려는 content provider의 주소
cursor = context.contentResolver.query(
	android.net.Uri.uri, // Content URI, ex) CallLog.Calls.CONTENT_URI, 
    String[] projection, // 가져올 테이블의 칼럼 이름
	String selection, // 조건, SQL의 WHERE 절과 유사
    String[] selectionArgs, // selection의 ?에 들어갈 인자
    String sortOrder // SQL의 ORDER BY에 해당
)
cursor.moveToNext()
cursor.getColumnIndex(.getString or .getLong) // 칼럼 인덱스

권한 확인

private fun hasPermission(perm: String) = 
	context.checkSelfPermission(perm) == PackageManager.PERMISSION_GRANTED

필요한 권한 등록

<uses-permission android:name="android.permission.READ_CALL_LOG" />

<uses-permission
	android:name="android.permission.READ_EXTERNAL_STORAGE"
	android:maxSdkVersion="32" />

<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />

<uses-permission android:name=
                 "android.permission.READ_MEDIA_VISUAL_USER_SELECTED" />

Broadcast와 ContentResolver를 함께 응용

  • SMS를 수신 후 발송자 이름을 주소록에서 조회
  • 추가로 필요한 권한 READ_CONTACTS
<uses-permission android:name="android.permission.READ_CONTACTS" />
permissions += Manifest.permission.READ_CONTACTS

0개의 댓글