Android

Android - 인텐트(Intent), 브로드캐스트(Broadcast)

임베디드 친구 2024. 11. 14. 15:24
반응형

안녕하세요! 오늘은 안드로이드 개발에서 중요한 개념 중 하나인 인텐트(Intent)브로드캐스트(Broadcast)에 대해 알아보려고 합니다. 인텐트와 브로드캐스트는 안드로이드 앱 구성 요소 간의 상호 작용을 가능하게 해주며, 앱 내에서 또는 앱 간에 데이터를 주고받을 수 있게 도와줍니다.

1. 인텐트(Intent)란?

인텐트(Intent)는 두 가지 주요 기능을 담당합니다:

  1. 액티비티 간의 전환: 화면 전환을 위해 사용됩니다.
  2. 서비스 실행: 백그라운드에서 수행할 작업을 요청할 때 사용됩니다.

인텐트는 명시적 인텐트(Explicit Intent)와 암시적 인텐트(Implicit Intent)로 나눌 수 있습니다.

  • 명시적 인텐트: 특정 컴포넌트를 직접 지정하여 호출하는 인텐트입니다. 주로 같은 애플리케이션 내에서 사용됩니다.
  • 암시적 인텐트: 특정 작업을 수행할 수 있는 컴포넌트를 안드로이드 시스템이 선택하도록 하는 인텐트입니다. 예를 들어, 웹 페이지를 열거나 사진을 공유하는 등의 작업에 사용됩니다.

명시적 인텐트 예제

다음은 명시적 인텐트를 사용하여 두 액티비티 간에 데이터를 전달하는 간단한 예제입니다.

// MainActivity.kt
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button

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

        val button = findViewById<Button>(R.id.button)
        button.setOnClickListener {
            val intent = Intent(this, SecondActivity::class.java)
            intent.putExtra("message", "Hello from MainActivity!")
            startActivity(intent)
        }
    }
}
// SecondActivity.kt
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView

class SecondActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)

        val message = intent.getStringExtra("message")
        val textView = findViewById<TextView>(R.id.textView)
        textView.text = message
    }
}

위 예제에서는 MainActivity에서 SecondActivity로 데이터를 전달하기 위해 명시적 인텐트를 사용했습니다. 버튼을 클릭하면 메시지가 SecondActivity로 전달되어 화면에 표시됩니다.

암시적 인텐트 예제

다음은 암시적 인텐트를 사용하여 웹 페이지를 여는 예제입니다.

import android.content.Intent
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button

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

        val button = findViewById<Button>(R.id.button)
        button.setOnClickListener {
            val intent = Intent(Intent.ACTION_VIEW)
            intent.data = Uri.parse("https://www.example.com")
            startActivity(intent)
        }
    }
}

버튼을 클릭하면 웹 브라우저를 통해 지정된 URL이 열리게 됩니다. 이처럼 암시적 인텐트를 사용하면 특정 작업을 수행할 수 있는 다양한 앱을 호출할 수 있습니다.

2. 브로드캐스트(Broadcast)란?

브로드캐스트(Broadcast)는 시스템이나 앱이 발생한 이벤트를 다른 앱에 알릴 수 있는 방법입니다. 예를 들어, 배터리 상태 변경, 네트워크 연결 상태 변경 등 다양한 시스템 이벤트가 있습니다.

브로드캐스트는 크게 두 가지로 나뉩니다:

  1. 시스템 브로드캐스트: 안드로이드 시스템에서 발생하는 이벤트를 알리기 위해 사용됩니다.
  2. 커스텀 브로드캐스트: 애플리케이션에서 자체적으로 정의한 이벤트를 알리기 위해 사용됩니다.

브로드캐스트를 사용하기 위해서는 브로드캐스트 리시버(BroadcastReceiver)를 등록해야 합니다.

브로드캐스트 리시버 예제

다음은 배터리 상태 변경을 감지하는 브로드캐스트 리시버 예제입니다.

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.BatteryManager
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView

class MainActivity : AppCompatActivity() {
    private lateinit var batteryStatusTextView: TextView

    private val batteryReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            val level = intent?.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) ?: -1
            batteryStatusTextView.text = "Battery Level: $level%"
        }
    }

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

        batteryStatusTextView = findViewById(R.id.batteryStatusTextView)

        val intentFilter = IntentFilter(Intent.ACTION_BATTERY_CHANGED)
        registerReceiver(batteryReceiver, intentFilter)
    }

    override fun onDestroy() {
        super.onDestroy()
        unregisterReceiver(batteryReceiver)
    }
}

위 예제에서는 배터리 상태 변경을 감지하기 위해 ACTION_BATTERY_CHANGED 인텐트를 사용하여 브로드캐스트 리시버를 등록했습니다. 배터리 상태가 변경될 때마다 onReceive 메서드가 호출되어 배터리 수준이 화면에 표시됩니다.

3. 로컬 브로드캐스트(Local Broadcast)

로컬 브로드캐스트는 애플리케이션 내에서만 브로드캐스트를 전송하고 수신하도록 제한하는 방식입니다. 이는 보안성과 성능을 향상시키기 위해 사용됩니다. 안드로이드에서는 LocalBroadcastManager를 사용하여 로컬 브로드캐스트를 구현할 수 있습니다.

로컬 브로드캐스트 예제

다음은 로컬 브로드캐스트를 사용하여 두 컴포넌트 간에 메시지를 전달하는 예제입니다.

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.widget.Button
import android.widget.TextView
import androidx.localbroadcastmanager.content.LocalBroadcastManager

class MainActivity : AppCompatActivity() {
    private lateinit var messageTextView: TextView

    private val localReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            val message = intent?.getStringExtra("message")
            messageTextView.text = message
        }
    }

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

        messageTextView = findViewById(R.id.messageTextView)
        val button = findViewById<Button>(R.id.button)

        button.setOnClickListener {
            val intent = Intent("com.example.LOCAL_BROADCAST")
            intent.putExtra("message", "Hello from MainActivity!")
            LocalBroadcastManager.getInstance(this).sendBroadcast(intent)
        }

        val intentFilter = IntentFilter("com.example.LOCAL_BROADCAST")
        LocalBroadcastManager.getInstance(this).registerReceiver(localReceiver, intentFilter)
    }

    override fun onDestroy() {
        super.onDestroy()
        LocalBroadcastManager.getInstance(this).unregisterReceiver(localReceiver)
    }
}

위 예제에서는 LocalBroadcastManager를 사용하여 로컬 브로드캐스트를 전송하고 수신하는 방법을 보여줍니다. 버튼을 클릭하면 로컬 브로드캐스트가 전송되고, 이를 수신한 리시버가 메시지를 화면에 표시합니다.

4. 결론

인텐트와 브로드캐스트는 안드로이드 애플리케이션 개발에서 매우 중요한 역할을 합니다. 인텐트는 컴포넌트 간의 데이터 전달 및 작업 요청을 가능하게 하고, 브로드캐스트는 시스템 또는 애플리케이션 내에서 발생한 이벤트를 알릴 수 있게 합니다. 이번 포스팅에서는 명시적 인텐트, 암시적 인텐트, 브로드캐스트 리시버, 그리고 로컬 브로드캐스트에 대해 알아보았습니다.

반응형

'Android' 카테고리의 다른 글

Android - Service  (0) 2024.11.16
Android - Activity  (0) 2024.11.15
Android UI : 다이얼로그(Dialog)  (0) 2024.11.13
Android UI : Layout 장단점  (0) 2024.11.12
Android UI : ConstraintLayout - optimize  (0) 2024.11.11