Android์ 4๋ ์ปดํฌ๋ํธ ์ค ํ๋์ธ Broadcast Receiver๋ ์์คํ ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ํ๋ ๋ธ๋ก๋์บ์คํธ ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ๊ณ ์ฒ๋ฆฌํ๋ ์ญํ ์ ํฉ๋๋ค.
์ด ๊ฐ์ด๋์์๋ Broadcast Receiver์ ๊ฐ๋ ๊ณผ ์ ํ, ์ต์ ๋ฒ์ ์์์ ๋ณ๊ฒฝ ์ฌํญ ๋ฑ์ ๋ํด ๋ค๋ฃจ๊ณ ์์ต๋๋ค.
Broadcast Receiver
Broadcast Receiver๋ ์๋๋ก์ด๋ ์์คํ ์ด๋ ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ณด๋ด๋ Broadcast๋ฅผ ์์ ํ๊ณ , ์ด์ ๋ํ ๋์์ ์ํํ๋ ์ปดํฌ๋ํธ ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ๋คํธ์ํฌ ๋ณ๊ฒฝ, ๋ฐฐํฐ๋ฆฌ ์ํ ๋ณํ ๋ฑ์ ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ ์ ์์ต๋๋ค.
์๋๋ก์ด๋์์๋ ๋ ๊ฐ์ง ์ ํ์ ๋ธ๋ก๋์บ์คํธ๊ฐ ์กด์ฌํฉ๋๋ค.
๋ฐ๋ก ์์คํ ๋ธ๋ก๋์บ์คํธ์ ์ฑ ๋ธ๋ก๋์บ์คํธ์ ๋๋ค.
System Broadcast
์๋๋ก์ด๋ ์์คํ ์์ ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ ์๋์ผ๋ก ๋ฐ์ํ๋ ๋ธ๋ก๋์บ์คํธ์ ๋๋ค.
์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- android.intent.action.BOOT_COMPLETE → ๊ธฐ๊ธฐ ๋ถํ ์๋ฃ
- android.net.conn.CONNECTIVITY_CHANGE → ๋คํธ์ํฌ ์ํ ๋ณ๊ฒฝ
- android.intent.action.BATTERY_LOW → ๋ฐฐํฐ๋ฆฌ ๋ถ์กฑ ์ํ
App Broadcast
๊ฐ๋ฐ์๊ฐ ์ง์ ์ ์ํ๊ณ ๋ฐ์์ํค๋ ๋ธ๋ก๋์บ์คํธ์ ๋๋ค. ํน์ ์ด๋ฒคํธ ๋ฐ์ ์ ์ฑ ๋ด๋ถ์ ์ฌ๋ฌ ์ปดํฌ๋ํธ๊ฐ ์ด๋ฅผ ๊ฐ์งํ๊ณ ๋์์ ์ํํฉ๋๋ค.
์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์์ ์ฑ์์ ๊ณก ๋ณ๊ฒฝ ์ด๋ฒคํธ ๋ฐ์
- ๋ค์ด๋ก๋ ์๋ฃ ์๋ฆผ ์ ์ก
Broadcast Receiver ๋ฑ๋ก ๋ฐฉ์
Broadcast Receiver๋ ์ ์ ๋ฑ๋ก๊ณผ ๋์ ๋ฑ๋ก, ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํํ ์ ์์ต๋๋ค.
Static Broadcast Receiver (์ ์ ๋ธ๋ก๋์บ์คํธ ๋ฆฌ์๋ฒ)
AndroidManifest.xml์ <receiver> ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฑ๋กํ๋ ๋ธ๋ก๋์บ์คํธ ์์ ๋ฐฉ์์ ๋๋ค.
์ด ๋ฐฉ์์ ์ฑ์ด ์คํ๋์ง ์์ ์ํ์์๋ ํน์ ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ ์ ์๋ ํน์ง์ด ์์ต๋๋ค. ์ฃผ๋ก ๋ถํ ์๋ฃ, ๋คํธ์ํฌ ์ํ ๋ณ๊ฒฝ ๋ฑ์ ์์คํ ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
ํ์ง๋ง Android 8.0(API 26) ์ด์์์๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ ํ์ผ๋ก ์ธํด ์ผ๋ถ ๋ธ๋ก๋์บ์คํธ๋ฅผ ์ ์ ๋ฐฉ์์ผ๋ก ๋ฐ์ ์ ์์ผ๋ฉฐ, ๋์ ๋ฑ๋ก์ด๋ WorkManager ๋ฑ์ ๋์ฒด ๋ฐฉ์์ด ํ์ํฉ๋๋ค.
๋ค์์ ๊ธฐ๊ธฐ ์ ์ ์ฌ๋ถ๋ฅผ ์์ ํ๋ ์์ ์ ๋๋ค.
<receiver android:name=".PowerConnectionReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
</intent-filter>
</receiver>
class PowerConnectionReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
when (intent.action) {
Intent.ACTION_POWER_CONNECTED ->
Toast.makeText(context, "์ถฉ์ ๊ธฐ ์ฐ๊ฒฐ๋จ", Toast.LENGTH_SHORT).show()
Intent.ACTION_POWER_DISCONNECTED ->
Toast.makeText(context, "์ถฉ์ ๊ธฐ ํด์ ๋จ", Toast.LENGTH_SHORT).show()
}
}
}
์ ์ ๋ธ๋ก๋์บ์คํธ ๋ฆฌ์๋ฒ๋ฅผ ์ฌ์ฉํ ๋๋ ๋ณด์ ๋ฐ ๊ถํ ์ค์ ์ ์ ์ํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํน์ ๋ธ๋ก๋์บ์คํธ๋ฅผ ์์ ํ๋ ค๋ฉด ์ถ๊ฐ์ ์ธ ๊ถํ์ด ํ์ํ ์ ์์ต๋๋ค.
Dynamic Broadcast Receiver (๋์ ๋ธ๋ก๋์บ์คํธ ๋ฆฌ์๋ฒ)
์ฑ์ด ์คํ ์ค์ผ ๋๋ง ํน์ ๋ธ๋ก๋์บ์คํธ๋ฅผ ๊ฐ์งํ ์ ์๋๋ก ์ฝ๋์์ ์ง์ ๋ฑ๋กํ๋ ๋ฐฉ์์ ๋๋ค.
Android 8.0๋ถํฐ ์ ์ ๋ธ๋ก๋์บ์คํธ ๋ฆฌ์๋ฒ๊ฐ ์ผ๋ถ ์ ํ๋์๊ธฐ์, ๋์ ๋ธ๋ก๋์บ์คํธ์ ๋น์ค์ด ๋ ํ๋๋์์ต๋๋ค.
๋ค์์ ๋คํธ์ํฌ ์ฐ๊ฒฐ ์ฌ๋ถ๋ฅผ ์์ ํ๋ ์์ ์ ๋๋ค.
class NetworkChangeReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val networkInfo = connectivityManager.activeNetworkInfo
if (networkInfo != null && networkInfo.isConnected) {
Toast.makeText(context, "์ธํฐ๋ท ์ฐ๊ฒฐ๋จ", Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(context, "์ธํฐ๋ท ์ฐ๊ฒฐ ๋๊น", Toast.LENGTH_SHORT).show()
}
}
}
class MainActivity : AppCompatActivity() {
private lateinit var networkReceiver: NetworkChangeReceiver
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
networkReceiver = NetworkChangeReceiver()
val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
registerReceiver(networkReceiver, filter)
}
override fun onDestroy() {
super.onDestroy()
unregisterReceiver(networkReceiver)
}
}
์ ์ฝ๋๋ฅผ ํตํด ์ ์ ์๋ฏ์ด, IntentFilter๋ฅผ ์ฌ์ฉํด ๋ธ๋ก๋์บ์คํธ ๋ฆฌ์๋ฒ๋ฅผ ๋ฑ๋กํ ์ ์์ต๋๋ค.
๋ฑ๋ก๋ ๋ฆฌ์๋ฒ๋ ์ง์ ๋ IntentFilter์ ํด๋นํ๋ ์ธํ ํธ๊ฐ ๋ฐ์ํ ๋๋ง ์์ ๋ฉ๋๋ค.
val filter = IntentFilter("com.example.CUSTOM_BROADCAST")
val receiver = CustomReceiver()
registerReceiver(receiver, filter)
์ฐธ๊ณ ๋ก API33 ๋ถํฐ๋ ์ธ๋ถ ์ฑ์ ๋ธ๋ก๋์บ์คํธ ์์ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ ํ๋๊ทธ๊ฐ ์ถ๊ฐ๋์์ต๋๋ค.
Context.RECEIVER_EXPORTED ๋ค๋ฅธ ์ฑ์ผ๋ก ๋ถํฐ ๋ธ๋ก๋์บ์คํธ๋ฅผ ์์
Context.RECEIVER_NOT_EXPORTED ๋ค๋ฅธ ์ฑ์ผ๋ก ๋ถํฐ ๋ธ๋ก๋์บ์คํธ๋ฅผ ์์ ํ์ง ์์
val filter = IntentFilter("com.example.CUSTOM_BROADCAST")
val receiver = CustomReceiver()
registerReceiver(receiver, filter, Context.RECEIVER_EXPORTED)
๋์ ๋ธ๋ก๋์บ์คํธ ๋ฆฌ์๋ฒ๋ ์ฑ ์ข ๋ฃ ์์ ์๋์ผ๋ก ํด์ ๋์ง ์์ผ๋ฏ๋ก, onDestroy()์ ๊ฐ์ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋์์ ๋ฆฌ์์ค๋ฅผ ํด์ ํด์ผ ํฉ๋๋ค.
override fun onDestroy() {
super.onDestroy()
unregisterReceiver(receiver)
}
๋ธ๋ก๋์บ์คํธ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ ๋๋ ๋ธ๋ก๋์บ์คํธ๊ฐ ์์คํ
์์ ์ด๋ป๊ฒ ์ฒ๋ฆฌ๋๋์ง์ ๋ฐ๋ผ ๋ค์๊ณผ ๊ฐ์ด 3๊ฐ์ง๋ก ๋ถ๋ฅํ ์ ์์ต๋๋ค.
Global Broadcast (์ ์ญ ๋ธ๋ก๋์บ์คํธ)
์ ์ญ ๋ธ๋ก๋์บ์คํธ๋ ์์คํ ์์ ์ ์ญ์ ์ผ๋ก ๋ฑ๋ก๋ ๋ฆฌ์๋ฒ๊ฐ ๋ชจ๋ ์ฑ์์ ์์ ํ ์ ์๋๋ก ํ๋ ๋ฐฉ์์ ๋๋ค. ์ด๋ ์ฑ ๊ฐ ํต์ ์ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
์ธ๋ถ ์ฑ์์๋ ํด๋น ๋ธ๋ก๋์บ์คํธ๋ฅผ ์์ ํ ์ ์์ผ๋ฏ๋ก ๋ณด์์ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ ์ก์ ์ ํฌํจํ๋ ๋ธ๋ก๋์บ์คํธ๋ ์ ํํ๋ ๊ฒ์ด ์ ํฉํฉ๋๋ค.
val intent = Intent("com.example.CUSTOM_BROADCAST")
sendBroadcast(intent)
Ordered Broadcast (์์ฐจ ๋ธ๋ก๋์บ์คํธ)
์์ฐจ ๋ธ๋ก๋์บ์คํธ๋ ๋ธ๋ก๋์บ์คํธ๋ฅผ ํ๋์ฉ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ๋๋ค.
์ฆ, ์ฌ๋ฌ ๋ฆฌ์๋ฒ๊ฐ ๋์ผํ ๋ธ๋ก๋์บ์คํธ๋ฅผ ์์ ํ ๋, ์์ฐจ์ ์ผ๋ก ํ๋์ฉ ํธ์ถ๋๊ณ , ๋ฆฌ์๋ฒ๊ฐ ํด๋น ๋ธ๋ก๋์บ์คํธ๋ฅผ ์๋นํ ์ง ์๋๋ฉด ๋ค์ ๋ฆฌ์๋ฒ๋ก ์ ๋ฌํ ์ง ๊ฒฐ์ ํฉ๋๋ค.
๋ํ, ์ฐ์ ์์๋ฅผ ์ค์ ํ์ฌ ํน์ ๋ฆฌ์๋ฒ๊ฐ ๋ค๋ฅธ ๋ฆฌ์๋ฒ๋ณด๋ค ๋จผ์ ํน์ ๋์ค์ ์์ ํ ์ ์๋๋ก ํฉ๋๋ค.
val filter = IntentFilter("com.example.ORDERED_BROADCAST")
filter.priority = 10
sendOrderedBroadcast(intent, null, receiver, null, Activity.RESULT_OK, null, null)
Local Broadcast (๋ก์ปฌ ๋ธ๋ก๋์บ์คํธ)
๋ก์ปฌ ๋ธ๋ก๋์บ์คํธ๋ ์ฑ ๋ด์์๋ง ์ฌ์ฉํ ์ ์๋ ๋ธ๋ก๋์บ์คํธ์ ๋๋ค. ์์คํ ์ด๋ ๋ค๋ฅธ ์ฑ์ ์ํฅ์ ๋ฏธ์น์ง ์์ผ๋ฉฐ ์ฑ์ ํ๋ก์์ค ๋ด์์๋ง ์ ์ก๋๊ณ ์์ ๋ฉ๋๋ค.
์ ์ญ ๋ธ๋ก๋์บ์คํธ๋ ์์คํ ์ ์ฒด์ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์์ง๋ง, ๋ก์ปฌ ๋ธ๋ก๋์บ์คํธ๋ ์ฑ์ ๋ฉ๋ชจ๋ฆฌ ๋ด์์๋ง ๋์ํ๊ธฐ ๋๋ฌธ์ ์์คํ ๋ฆฌ์์ค๋ฅผ ์ ์ฝํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ฑ์ด๋ ์์คํ ๊ณผ ๊ด๋ จ๋ ๋์์ ๋ํ ์ํฅ์ ๋ฏธ์น์ง ์๊ธฐ ๋๋ฌธ์ ๋ณด์ ์ธก๋ฉด์์๋ ์์ ํฉ๋๋ค.
val intent = Intent("com.example.LOCAL_BROADCAST")
LocalBroadcastManager.getInstance(context).sendBroadcast(intent)
ํ์ง๋ง ํ์ฌ LocalBroadcastManager๋ Deprecated ๋์์ต๋๋ค.
์ด์ ๋ฐ๋ผ LiveData ๋๋ SharedFlow ์ฌ์ฉ์ด ๊ถ์ฅ๋ฉ๋๋ค.
๋ธ๋ก๋์บ์คํธ ๋ฆฌ์๋ฒ๋ ๋ค์ํ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ง๋ง, ์ฑ๋ฅ๊ณผ ๋ณด์ ์ธก๋ฉด์์ ์ ์ฝ์ด ์์ ์ ์์ต๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค์ํ ๋์ฒด ์๋ฃจ์ ์ด ์กด์ฌํฉ๋๋ค.
์ฑ์ ์๊ตฌ์ฌํญ์ ๋ง๋ ์ต์ ์ ๋ฐฉ๋ฒ์ ์ ํํ์ฌ ์์ ์ ์ด๊ณ ์ฑ๋ฅ์ด ์ข์ ์ฑ์ ๋ง๋๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์๋๋ก์ด๋ ๊ฐ๋ฐ์ ๋ก๋๋งต์ ๋ฐ๋ผ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
'๐ป Programming > Android Developer AtoZ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Android] App Components - (6) Intent ์๋ฒฝ ๊ฐ์ด๋ (1) | 2025.03.24 |
---|---|
[Android] App Components - (5) Content Provider ์๋ฒฝ ๊ฐ์ด๋ (2) | 2025.03.24 |
[Android] App Components (3) - Service ์๋ฒฝ ๊ฐ์ด๋ (1) | 2025.03.19 |
[Android] App Components (2) - Activity ์๋ฒฝ ๊ฐ์ด๋ (1) | 2025.03.05 |
[Android] App Components (1) - ์๋๋ก์ด๋ 4๋ ์ปดํฌ๋ํธ (0) | 2025.02.28 |