안드로이드 앱은 안드로이드 시스템이나 다른 안드로이드 앱으로부터 브로드캐스트 메시지를 받거나 보낼 수 있다. 브로드캐스트는 어떤 이벤트가 발생했을 때 보내진다. 예를 들어, 안드로이드 시스템은 시스템이 부팅되었을 때, 배터리가 없을 때 등에 보낼 수 있다.
앱들은 특정한 브로드캐스트를 받기 위해 리시버를 등록할 수 있다. 그러나 브로드캐스트를 받고 작업을 백그라운드에서 처리하는 상황을 남용해서는 안된다. 이는 시스템 성능을 저하시킬 수 있다.
순차적으로 실행되기 때문에 한꺼번에 너무 많은 Broadcast가 처리되도록 하면 안된다. 오래 대기하면 안된다. ANR이 발생하기 때문에 최대한 간단한 작업만 하도록 해야한다.
sendBroadcast()
함수가 호출된다.sendBroadcast()
함수가 호출되어 자동으로 onReceive()
함수가 호출된다.<?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>
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에 등록) 대신
동적리시버(코드에서 리시버 등록)를 사용해야한다.
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()
}
}
<?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>