[Android] BroadcastReceiver

MinKyu Kim·2021년 8월 9일
0

Android

목록 보기
4/7
post-custom-banner

BroadcastReceiver

개념

안드로이드 앱은 안드로이드 시스템이나 다른 안드로이드 앱으로부터 브로드캐스트 메시지를 받거나 보낼 수 있다. 브로드캐스트는 어떤 이벤트가 발생했을 때 보내진다. 예를 들어, 안드로이드 시스템은 시스템이 부팅되었을 때, 배터리가 없을 때 등에 보낼 수 있다.

앱들은 특정한 브로드캐스트를 받기 위해 리시버를 등록할 수 있다. 그러나 브로드캐스트를 받고 작업을 백그라운드에서 처리하는 상황을 남용해서는 안된다. 이는 시스템 성능을 저하시킬 수 있다.

순차적으로 실행되기 때문에 한꺼번에 너무 많은 Broadcast가 처리되도록 하면 안된다. 오래 대기하면 안된다. ANR이 발생하기 때문에 최대한 간단한 작업만 하도록 해야한다.

코드설명

  • 아래 코드 작성후 애뮬레이터를 실행한다.
  • BR버튼 이라고 적혀있는 버튼을 클릭한다.
  • 버튼 클릭시 MainActivity 의 sendBroadcast() 함수가 호출된다.
  • sendBroadcast() 함수가 호출되어 자동으로 onReceive() 함수가 호출된다.
  • 화면에 Toast 메세지가 나타난다.

예제 (xml 코드)

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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=".MainActivity">

    <Button
        android:id="@+id/brButton"
        android:textSize="20sp"
        android:text="BR버튼"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</androidx.constraintlayout.widget.ConstraintLayout>

예제 (kotlin 코드)

MainActivity.kt

class MainActivity : AppCompatActivity() {

    private val brButton by lazy {findViewById<Button>(R.id.brButton)}

    //BroadcastReceiver 객체 생성
    val br = MyReceiver()

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


        // 안드로이드 8.0 버전 이상에서는 코드로 IntentFilter 등록을 해주어야한다.
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
            val filter = IntentFilter("com.elliot.testbr")
            registerReceiver(br, filter)
        }

        //버튼 클릭시 송신하기
        brButton.setOnClickListener {

            val intent = Intent("com.elliot.testbr")
            sendBroadcast(intent)
        }
    }

    // 안드로이드 8.0 버전 이상에서는 코드로 IntentFilter 해제 해주어야한다.
    override fun onDestroy() {
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
            unregisterReceiver(br)
        }
        super.onDestroy()
    }
}

주의사항

안드로이드 8.0 이상부터는 정적리시버(AndroidManifest.xml에 등록) 대신
동적리시버(코드에서 리시버 등록)를 사용해야한다.

MyReceiver.kt

class MyReceiver : BroadcastReceiver() {

    //sendBroadcast() 호출시 자동으로 호출되는 메소드
    override fun onReceive(context: Context, intent: Intent) {
        // This method is called when the BroadcastReceiver is receiving an Intent broadcast.
        Toast.makeText(context, "BR테스트입니다.", Toast.LENGTH_SHORT).show()
    }
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.elliot.step02broadcastreceiver1">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Review">
        <!--receiver 등록-->
        <receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.elliot.testbr"/>
            </intent-filter>
        </receiver>

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
profile
성장하는 개발자
post-custom-banner

0개의 댓글