본문 바로가기
안드로이드/Service

안드로이드 Broad Cast Receiver

by 김어찐 2022. 6. 16.
728x90

Broad Cast Reciever는 안드로이드 OS에서 특정 상황에 발생하는 메시지를 받아 들여 동작하는 실행단위이다.
Broad Cast Receiver 는 반드시 외부에서 접근을 하기위한 이름을 가져야 한다. 
실제 동작은 애플리케이션이 단말기에 설치 되면 안드로이드 OS는 Broad Cast Receiver에 등록된 이름으로 정리하여 목록화한다.
안드로이드 OS에서 어떤 사건이 발생하면 사건과 관련된 이름으로 지정된  Broad Cast Receiver를 찾아 동작 시킨다.
또 애플리케이션에서 이름을 전달하여 실행을 요청하면 해당 이름이 지정된 Broad Cast Receiver를 찾아 동작 시킨다.

 

Broad Cast Receiver

Broad Cast Receiver 는 평소에는 동작하지 않다가 동작 요청이 발생하면 동작하게 된다.
이 때, 동작 요청은 이름을 통해 요청할 수 있으며 intent filter를 통해 이름을 등록한다.

 

 

안드로이드 8.0 이후 제약 사항

안드로이드 8.0 부터는 개발자가 만든 Broad Cast Receiver와 OS에서 제공하는 일부 Broad Cast Receiver는 코드를 통해서만 등록이 가능하다.
이는 보안상의 이유로 Broad Cast Receiver를 가진 애플리케이션 내부에서만 사용하기 위한 제약이다. 

 

package com.example.broadcastreceiver

import android.content.Intent
import android.content.IntentFilter
import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    val br = TestReceiver()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)


        // 8.0 이상 부터는 코드를 통해 등록하고 해제 해야한다.
        // 8.0 이상 부터 앱이 실행중이어야 receiver 기능 동작
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val filter = IntentFilter("kr.co.softcampus.textbr")
            registerReceiver(br,filter)
        }

        button.setOnClickListener {
            // 같은 어플리케이션이면 클래스로 intent지정 가능
            // val brIntent = Intent(this,TestReceiver::class.java)

            // 안드로이드 8.0부터는 아래 intent안된다.
            val brIntent = Intent("kr.co.softcampus.textbr")
            sendBroadcast(brIntent)
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            unregisterReceiver(br)
        }
    }
}

 

 

다른 앱에서 broadcast 전송

package com.example.brapp2

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        button.setOnClickListener {
            val brIntent = Intent("kr.co.softcampus.textbr")
            sendBroadcast(brIntent)
        }
    }
}
728x90

'안드로이드 > Service' 카테고리의 다른 글

안드로이드 IPC  (0) 2022.06.16
안드로이드 Service  (0) 2022.06.16
안드로이드 시스템 메시지  (0) 2022.06.16