본문 바로가기
안드로이드 코틀린

[Kotlin][Android] BroadCast 이벤트 송신, 수신하기

by teamnova 2022. 2. 4.

안녕하세요. 이번 시간에는 안드로이드 4대 컴포넌트 가운데 하나인 BroadCast Receiver를 코틀린 언어로 간단히 사용하는 예제를 만들어 보도록 하겠습니다.

 

BroadCast Receiver란?

Android apps can send or receive broadcast messages from the Android system and other Android apps, similar to the publish-subscribe design pattern.

공식 홈페이지에서 'Broadcast Receiver'에 대한 설명을 인용해보았습니다. 즉 저희가 만들고 있는 앱이 안드로이드 시스템이나 다른 앱으로부터 메시지를 받을 수 있으며 그 방법은 '게시-구독' 디자인 패턴과 흡사하다고 합니다. 

구체적인 사용 사례로는 충전중이라던가 SNS를 받았다는 등 다양한 이벤트를 구독할 수 있습니다. 또한 시스템에서 발생시키는 이벤트 뿐만 아니라 개인이 이벤트를 등록할 수 있으니 사용처는 더욱 다양해집니다.

 

구체적인건 아래 공홈을 통해서 확인해보세요.

https://developer.android.com/guide/components/broadcasts

 

브로드캐스트 개요  |  Android 개발자  |  Android Developers

브로드캐스트 개요 Android 앱은 Android 시스템 및 기타 Android 앱에서 게시-구독 디자인 패턴과 유사한 브로드캐스트 메시지를 받거나 보낼 수 있습니다. 관심 있는 이벤트가 발생할 때 이러한 브로

developer.android.com

1. BroadCast 송신 및 수신 (커스텀)

자신만의 BroadCast를 송신하고 수신을하고 싶다면 LocalBroadcastManager를 사용해보도록 합시다. 사용하는 방법은 간단합니다. 송신측과 수신측 코드를 아래와 같이 작성해주면 됩니다.

 

송신측

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

        val broadcaster = LocalBroadcastManager.getInstance(this)

        val send = findViewById<View>(R.id.send_broadcast) as Button
        send.setOnClickListener {
            Log.d("Tag", "클릭 실행 브로드캐스트 실행")
            val intent = Intent("MyData")
            intent.putExtra("phone", "010-0000-1111")
            broadcaster.sendBroadcast(intent)
        }
    }

수신측 (커스텀 이벤트)

    private val mMessageReceiver: BroadcastReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context, intent: Intent) {
            Log.d("Tag", "커스텀 브로드캐스트 실행 받음")
            Toast.makeText(context, intent.getStringExtra("phone"), Toast.LENGTH_LONG).show()
        }
    }

수신측 (시스템 이벤트)

var br: BroadcastReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context, intent: Intent) {
            if (intent.action == Intent.ACTION_BATTERY_CHANGED) {
                val toast = Toast.makeText(context, "Battery status is changed.", Toast.LENGTH_LONG)
                toast.show()
            } else if (intent.action == Intent.ACTION_SCREEN_ON) {
                val toast = Toast.makeText(context, "Screen on.", Toast.LENGTH_LONG)
                toast.show()
            } else if (intent.action == "example.test.broadcast") {
                val toast = Toast.makeText(context, "Customize broadcast!", Toast.LENGTH_LONG)
                toast.show()
            }
        }
    }

 

브로드 캐스트는 생명주기에 따라 등록 및 해제를 시켜줘야 합니다.

   protected void onStart() {
        super.onStart();
        LocalBroadcastManager.getInstance(this).registerReceiver((mMessageReceiver),
                new IntentFilter("MyData")
        );
    }

    @Override
    protected void onStop() {
        super.onStop();
        LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
    }


    private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d("Tag", "커스텀 브로드캐스트 실행 받음");
            Toast.makeText(context, intent.getStringExtra("phone"), Toast.LENGTH_LONG).show();
        }
    };


    @Override
    protected void onResume() {
        super.onResume();
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_BATTERY_CHANGED);
        filter.addAction(Intent.ACTION_SCREEN_ON);
        registerReceiver(br, filter);
    }

    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(br);
    }

작업 결과물은 아래와 같습니다.