꾸쀀함이 진리닀!!

μ–΄μ œλ³΄λ‹€ λ°œμ „ν•œ 였늘이 λ˜κ³ ν”ˆ πŸ§‘πŸ»β€πŸ’» 의 λΈ”λ‘œκ·Έ

Android/Kotlin

[Kotlin][Android] μ•ˆλ“œλ‘œμ΄λ“œ BroadcastReceiver(λΈŒλ‘œλ“œμΊμŠ€νŠΈλ¦¬μ‹œλ²„)에 λŒ€ν•˜μ—¬

λŽμš” 2022. 10. 19. 12:05

μ•ˆλ…•ν•˜μ„Έμš” πŸ‘‹

μ˜€λŠ˜μ€ μ•ˆλ“œλ‘œμ΄λ“œ λΈŒλ‘œλ“œμΊμŠ€νŠΈ λ¦¬μ‹œλ²„μ—

λŒ€ν•˜μ—¬ κ³΅λΆ€ν•œ λ‚΄μš©μ„ ν¬μŠ€νŒ…ν•΄λ³΄λ € ν•©λ‹ˆλ‹€.

 

 

BroadcastReceiver(λΈŒλ‘œλ“œμΊμŠ€νŠΈ λ¦¬μ‹œλ²„)λž€?

Android κ΅¬μ„±μš”μ†Œ 간에 λ©”μ‹œμ§€λ₯Ό 전달할 λ•Œ μ—¬λŸ¬ λŒ€μƒλ“€μ—κ²Œ ν•œκΊΌλ²ˆμ— λ©”μ‹œμ§€λ₯Ό 전달

ν•  ν•„μš”κ°€ μžˆμ„ λ•Œ μ‚¬μš©ν•˜λŠ” μ•ˆλ“œλ‘œμ΄λ“œμ˜ 4λŒ€ μ»΄ν¬λ„ŒνŠΈ 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.( κ΅¬μ„±μš”μ†Œ κ°„ λ©”μ‹œμ§€λŠ” Intentλ₯Ό 톡해 μ „λ‹¬ν•©λ‹ˆλ‹€.)

 


BroadcastReceiver 동적 등둝과 정적 등둝

정적 λ¦¬μ‹œλ²„λŠ” 앱이 μ’…λ£Œκ°€ 된 후에도 λΈŒλ‘œλ“œμΊμŠ€νŠΈλ₯Ό λ°›μœΌλ©΄ ν•΄λ‹Ή Intent에 λŒ€ν•˜μ—¬ 사전에 μ„ΈνŒ…ν–ˆλ˜ λͺ…령을 μ‹€ν–‰ν•˜κ²Œ λ©λ‹ˆλ‹€.

반면, 동적 λ¦¬μ‹œλ²„λŠ” 앱이 μ‹€ν–‰λ˜κ³  μžˆλŠ” μ€‘μ—λ§Œ 방솑을 λ°›μ•„ λͺ…령을 μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

정적 λ¦¬μ‹œλ²„ 생성 방법

class SilenceBroadcastReceiver : BroadcastReceiver(){
    override fun onReceive(p0: Context?, p1: Intent?) {
        
    }
}
<receiver android:name=".SilenceBroadcastReceiver"
            android:exported="true"> 
            <!--Android 12 이상 λΆ€ν„°λŠ” exportedλ₯Ό μ§€μ •ν•΄μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€.-->
            <intent-filter>
               <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
</receiver>

 

μœ„ 방법은 λΈŒλ‘œλ“œμΊμŠ€νŠΈ λ¦¬μ‹œλ²„λ₯Ό μ •μ μœΌλ‘œ λ“±λ‘ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

 

1. μœ„ μ½”λ“œμ™€ 같이 λΈŒλ‘œλ“œμΊμŠ€νŠΈ λ¦¬μ‹œλ²„λ₯Ό 상속받은 클래슀λ₯Ό ν•˜λ‚˜ 생성 ν›„

 

2. manifestνŒŒμΌμ— receiverνƒœκ·Έλ₯Ό 톡해 λΈŒλ‘œλ“œμΊμŠ€νŠΈ λ¦¬μ‹œλ²„λ₯Ό λ“±λ‘μ‹œμΌœμ€λ‹ˆλ‹€.

 

 3. λ§ˆμ§€λ§‰μœΌλ‘œ ν•΄λ‹Ή λ¦¬μ‹œλ²„μ— intent-filterνƒœκ·Έλ₯Ό 톡해 전달받을 action을 μ •μ˜ν•΄μ€€ ν›„

λΈŒλ‘œλ“œμΊμŠ€νŠΈ λ¦¬μ‹œλ²„ ν΄λž˜μŠ€μ—μ„œ ν•΄λ‹Ή μ•‘μ…˜ μˆ˜μ‹  μ‹œμ— μ·¨ν•  행동을 μ •μ˜ν•΄μ£Όλ©΄ λ©λ‹ˆλ‹€.

 

동적 λ¦¬μ‹œλ²„ 생성 방법

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".BroadCastActivity">
    <TextView
        android:id="@+id/brMessage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="50dp"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:textSize="15sp"
        android:textColor="@android:color/holo_blue_dark"
        android:text="Broadcast Message Display" />
    <Button
        android:id="@+id/sendBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Send BR"
        android:textAllCaps="false"
        android:textSize="20sp"
        android:layout_centerInParent="true"
        />
</RelativeLayout>

 

λΈŒλ‘œλ“œ 캐슀트 λ¦¬μ‹œλ²„λ₯Ό μ •μ˜ν•œ MainActivity λ‚΄λΆ€ inner class

inner class MyBroadcastReceiver() : BroadcastReceiver() {
        override fun onReceive(context: Context, receivedIntent: Intent?) {
            val intentValue = receivedIntent?.getIntExtra("extraKey" , -1)
            if(receivedIntent?.action == BR_ACTION_NAME){
                Log.d(TAG, "onReceive: Action Received!!!")
                binding.brMessage.text = String.format("λΈŒλ‘œλ“œ 캐슀트 %d번 싀행됨" , intentValue)
            }
        }
    }
}

 

MainActivity.kt

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import com.lee.mainbroadcastexample.databinding.ActivityBroadcastBinding

const val BR_ACTION_NAME = "com.lee.br.send.BR_MY_ACTION"

class BroadCastActivity : AppCompatActivity() {
    private val TAG = "BroadCastActivity"
    private lateinit var binding : ActivityBroadcastBinding
    private var mBroadCastReceiver : BroadcastReceiver? = null
    private var increment = 0
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityBroadcastBinding.inflate(layoutInflater).also {
            setContentView(it.root)
        }

        binding.sendBtn.setOnClickListener {
            with(Intent(BR_ACTION_NAME)){
                putExtra("extraKey" , ++increment)
                sendBroadcast(this)
                Log.d(TAG, "sendIntent!!")
            }

        }
    }

    override fun onStart() {
        super.onStart()
        val intentFilter = IntentFilter()
        intentFilter.addAction(BR_ACTION_NAME)
        mBroadCastReceiver = MyBroadcastReceiver()
        registerReceiver(mBroadCastReceiver , intentFilter)
    }

    override fun onStop() {
        super.onStop()
        unregisterReceiver(mBroadCastReceiver)
    }

    inner class MyBroadcastReceiver() : BroadcastReceiver() {
        override fun onReceive(context: Context, receivedIntent: Intent?) {
            val intentValue = receivedIntent?.getIntExtra("extraKey" , -1)
            if(receivedIntent?.action == BR_ACTION_NAME){
                Log.d(TAG, "onReceive: Action Received!!!")
                binding.brMessage.text = String.format("λΈŒλ‘œλ“œ 캐슀트 %d번 싀행됨" , intentValue)
            }
        }
    }
}

 

동적 λ¦¬μ‹œλ²„λŠ” μœ„μ™€ 같이 μ•‘ν‹°λΉ„ν‹° λ‚΄λΆ€μ—μ„œ λΈŒλ‘œλ“œμΊμŠ€νŠΈ λ¦¬μ‹œλ²„λ₯Ό μ •μ˜ν•΄μ€λ‹ˆλ‹€.

onStart()μ—μ„œ IntentFilter와 λΈŒλ‘œλ“œμΊμŠ€νŠΈλ¦¬μ‹œλ²„λ₯Ό 생성해주고

registerReceiver()λ₯Ό 톡해 λΈŒλ‘œλ“œ 캐슀트 λ¦¬μ‹œλ²„λ₯Ό λ™μ μœΌλ‘œ λ“±λ‘ν•΄μ€λ‹ˆλ‹€.

 

이후 λ™μž‘μ€ 정적 λ¦¬μ‹œλ²„μ™€ λ™μΌν•©λ‹ˆλ‹€.

λ‹€λ§Œ, 동적 λ¦¬μ‹œλ²„μ˜ 경우 unregisterReceiver()λ₯Ό 톡해 λ™μ μœΌλ‘œ λ¦¬μ‹œλ²„λ₯Ό ν•΄μ œν•΄μ€„ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 😎

 

μ μ ˆν•˜κ²Œ ν•΄μ œν•˜μ—¬ λ©”λͺ¨λ¦¬ 릭이 λ°œμƒν•˜μ§€ μ•Šλ„λ‘ ν•©μ‹œλ‹€!!!! πŸ€”

 

 

 


μ΄μƒμœΌλ‘œ λΈŒλ‘œλ“œ 캐슀트 λ¦¬μ‹œλ²„μ— κ΄€ν•œ ν¬μŠ€νŒ…μ„ λ§ˆμΉ˜κ² μŠ΅λ‹ˆλ‹€.

 

μ˜€λŠ˜λ„ μ¦μ½”ν•˜μ„Έμš” :)