반응형
Broad Cast Receiver
- 안드로이드 OS에서 특정 상황에 발생하는 메시지를 받아들여 동작하는 실행 단위 -> OS에서 방송을 하면 각 앱의 리시버가 동작
- 반드시 외부에서 접근하기 위한 이름을 가져야 함 (OS -> 앱 내부)
- 앱에서 안드 OS에게 방송을 요청해 방송하게 되면 BroadCastReceiver가 방송을 받아들여 동작 (같은 앱에 대해 요청해도)
- 실제로는 앱이 단말기에 설치되면 안드 OS가 앱 내부의 BroadCastReceiver를 목록화 해서 정리
- 안드 OS에서 어떤 사건이 발생 -> 관련 이름으로 지정된 BroadCastReceiver를 찾아 동작 시킴
- 앱에서 지정된 BroadCastReceiver 이름을 전달해 실행을 요청 -> 이 이름에 해당하는 앱의 BroadCastReceiver를 찾아 동작
- BroadCastReceiver 이름은 intent filter 를 통해 등록
- 안드 8.0 이후 -> 개발자가 만든 BroadCastReceiver와 OS에서 제공하는 일부 BroadCastReceiver는 코드를 통해서만 등록(보안상의 이유로 BroadCastReceiver를 가진 앱 내부에서만 사용하기 위한 제약)
- 동작시키고자 하는 리시버를 갖고 있는 앱이 실행되어져 있는 상태에서만 코드를 통해 등록 + 리시버 동작 요청이 가능 (그 전에는 앱이 꺼져 있어도 리시버 이름을 통해 리시버를 실행 -> 보안상 문제...)
[Mnifest 파일] *application 태그 안에 있습니다.
<receiver
android:name=".TestReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.androidstudy_kotlin.testbr" />
</intent-filter>
</receiver>
[BroadcastReceiver 클래스를 만들어준다]
class TestReceiver : BroadcastReceiver() {
// 안드 OS가 이 BroadcastReceiver를 실행하기 위해 찾으면 자동으로 호출되는 메서드
override fun onReceive(context: Context, intent: Intent) {
// This method is called when the BroadcastReceiver is receiving an Intent broadcast.
val str = "BroadcastReceiver 가 동작"
val ta = Toast.makeText(context,str,Toast.LENGTH_LONG)
ta.show()
}
}
val br = TestReceiver()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater) // 뷰바인딩 객체
val view = binding.root //뷰바인딩을 통해 레이아웃과 뷰가 결합 -> .root 를 통해 View 객체만를 뽑아내는(?)
setContentView(view)
// 안드 8.0 이상 부터는 코드를 통해 BroadcastReceiver 등록, 해제
// 해당 액티비티가 실행중인 상태에서만 리시버 동작이 가능
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val filter = IntentFilter("com.example.androidstudy_kotlin.testbr") // 드디어 리시버 등록!!
registerReceiver(br,filter)
}
// 기본 리스트 다이얼로그 (다이얼로그에 리트스뷰를 넣어 커스텀 한다고 생각하면 됨)
binding.button.setOnClickListener {
/* 클래스 이름으로 BroadcastReceiver 동작 (같은 앱의 리시버를 요청할 때만 가능) */
//val brIntent = Intent(this,TestReceiver::class.java)
//sendBroadcast(brIntent)
/* Manifest에 BroadcastReceiver 이름을 등록해 동작 (외부 앱의 리시버 동작을 요청하는 경우 필수!!) */
// 안드 8.0 이후 개발자가 만든 리시버 + 일부 내장 리시버는 코드를 통해서만 등록해야 한다는 제약!!
// -> 동작시키고자 하는 리시버를 갖고 있는 앱이 실행되어져 있는 상태에서만 가능
// -> 매니페스트에 등록되어 있는 이름도 무시해버리기 때문에 코드상에서 등록이 필요
val brIntent = Intent("com.example.androidstudy_kotlin.testbr")
sendBroadcast(brIntent)
}
}
override fun onDestroy() {
super.onDestroy()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
unregisterReceiver(br) // 리시버 해지
}
}
✔️ 다른 앱의 리시버를 동작시키고자 하는 경우, 안드 8.0 미만에서는 매니페스트에 등록된 이름을 통해 요청이 가능하지만 안드 8.0 이상에서는 반드시 리시버를 갖고 있는 앱이 실행되어 있는 상태여야 함. 따라서 리시버 보유 앱을 실행 시키고 다른 앱에서 리시버 동작을 요청해야지 사용이 가능 (안드 8.0 이상에서는 보안 상의 이유로 리시버 등록을 코드에서 진행하기 때문에 앱을 실행해 액티비티가 onCreate() 되야지만 리시버도 그제서야 등록 -> 요청 받을 준비완!)
반응형
'Android' 카테고리의 다른 글
[안드로이드/Service] Service(서비스) 란? (0) | 2023.04.20 |
---|---|
[안드로이드/Recevier] 시스템 메시지 (System Message) (0) | 2023.04.19 |
[안드로이드/Thread] RunOnUiThread (0) | 2023.04.17 |
[안드로이드/Thread] Handler를 사용한 화면 처리 (0) | 2023.04.17 |
[안드로이드/Thread] Handler를 사용한 반복작업 처리 (0) | 2023.04.16 |