코틀린 안드로이드 앱개발 강좌, 인텐트 이해하기

오늘은 안드로이드 앱 개발에서 매우 중요한 개념인 ‘인텐트(Intent)’에 대해 자세히 알아보겠습니다. 인텐트는 앱 구성 요소 간의 상호작용을 담당하며, 다른 Activity를 시작하거나 서비스, 브로드캐스트 수신자 등을 호출하는 데 사용됩니다.

1. 인텐트란?

인텐트는 애플리케이션의 구성 요소들 간의 상호작용을 관리하는 메시지 객체입니다. 예를 들어, 사용자가 버튼을 클릭하여 다른 Activity로 이동하고 싶을 때 인텐트를 사용합니다. 인텐트는 두 가지 주요 유형으로 나뉘어집니다.

  • 명시적 인텐트(Explicit Intent): 특정한 컴포넌트를 지정하여 그 컴포넌트를 시작하는 인텐트입니다. 일반적으로 같은 애플리케이션 내 다른 Activity를 호출할 때 사용됩니다.
  • 암시적 인텐트(Implicit Intent): 특정 컴포넌트를 명시하지 않고, 시스템에 의해 적절한 컴포넌트를 찾도록 요청하는 인텐트입니다. 이를 통해 다양한 애플리케이션이나 서비스를 호출할 수 있습니다.

2. 인텐트의 구성 요소

인텐트는 다음과 같은 주요 구성 요소로 이루어져 있습니다.

  • 액션(Action): 수행할 동작을 정의합니다. 예를 들어, Intent.ACTION_VIEW는 URL을 보고 싶다는 뜻입니다.
  • 데이터(Data): 전달할 데이터의 URI를 포함합니다. 예를 들어, 특정 웹 페이지의 링크일 수 있습니다.
  • 카테고리(Category): 인텐트가 어떤 종류의 컴포넌트를 호출할지를 설명합니다. 예를 들어 Intent.CATEGORY_DEFAULT는 일반적인 인텐트를 위한 카테고리입니다.
  • 컴포넌트 이름(Component Name): 호출할 컴포넌트의 명시적 이름입니다. 패키지 이름과 클래스 이름을 포함합니다.
  • 엑스트라(Extras): 추가적인 데이터를 전달하기 위한 키-값 쌍입니다.

3. 명시적 인텐트 사용하기

명시적 인텐트를 사용하려면, 호출할 Activity의 클래스 이름을 지정해야 합니다. 아래는 간단한 예제코드입니다.

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

        val button = findViewById

위 코드는 버튼 클릭 시 SecondActivity로 이동하는 명시적 인텐트를 생성합니다. startActivity(intent) 메서드를 호출해서 인텐트를 실행합니다.

4. 암시적 인텐트 사용하기

암시적 인텐트를 사용하면 다른 애플리케이션에서 처리할 수 있는 동작을 요청할 수 있습니다. 예를 들어 웹 페이지를 열거나, 사진을 찍는 앱을 호출할 수 있습니다. 아래는 웹 페이지를 여는 예제입니다.

val openWebPageIntent = Intent(Intent.ACTION_VIEW, Uri.parse("https://www.example.com"))
startActivity(openWebPageIntent)

위 코드는 사용자가 클릭 시 기본 웹 브라우저를 열어 https://www.example.com으로 이동하게 됩니다. 암시적 인텐트를 사용하기 위해서는 인텐트의 액션과 함께 데이터 URI를 포함시키면 됩니다.

5. 인텐트 필터(Intent Filter)

인텐트 필터는 암시적 인텐트가 어떤 컴포넌트와 매칭될 수 있는지를 정의하는 역할을 합니다. 인텐트 필터는 매니페스트 파일 내에서 정의되며, 액티비티가 어떤 종류의 인텐트를 처리할 수 있는지를 명시합니다.

<activity android:name=".SecondActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:scheme="http" android:host="www.example.com"/>
    </intent-filter>
</activity>

위 코드는 SecondActivityhttp://www.example.com의 링크를 처리할 수 있도록 설정합니다. 이제 사용자가 해당 사이트를 여는 인텐트를 보내면, SecondActivity가 호출됩니다.

6. 인텐트의 데이터 전달하기

인텐트를 통해 다른 Activity로 데이터(예: 문자열, 숫자 등)를 전달할 수 있습니다. 아래는 데이터를 전달하는 방법을 보여주는 예제입니다.

val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("EXTRA_MESSAGE", "Hello from MainActivity")
startActivity(intent)

위 코드에서는 EXTRA_MESSAGE라는 키로 문자열을 전달하고 있습니다. 다음은 SecondActivity에서 데이터를 수신하는 방법입니다.

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

        val message = intent.getStringExtra("EXTRA_MESSAGE")
        val textView = findViewById(R.id.textView)
        textView.text = message
    }
}

위 코드는 MainActivity에서 보낸 메시지를 SecondActivity에서 받는 예제입니다. 인텐트 객체의 getStringExtra() 메서드를 사용하여 데이터를 수신할 수 있습니다.

7. 플래그(Flags)를 사용한 인텐트의 동작 설정하기

인텐트 플래그는 인텐트를 실행할 때의 동작을 제어합니다. 예를 들어, 새 Activity를 시작할 때 기존 액티비티를 파괴하고 싶다면 FLAG_ACTIVITY_NEW_TASK 플래그를 사용할 수 있습니다. 아래는 플래그를 설정하는 방법을 보여주는 예제입니다.

val intent = Intent(this, MainActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
startActivity(intent)

위 코드에서는 MainActivity로 이동하면서 현재의 모든 이전 Activity를 삭제하는 동작을 설정합니다.

8. 결과 반환하기: StartActivityForResult

어떤 Activity를 시작하고 그 Activity에서 결과를 반환 받으려면 startActivityForResult() 메서드를 사용해야 합니다. 아래는 간단한 예제입니다.

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK) {
        val result = data?.getStringExtra("RESULT_DATA")
        // 결과 처리
    }
}

이 메서드는 호출된 Activity에 의해 호출될 때 결과를 처리할 수 있도록 합니다. 여기서 REQUEST_CODE는 직접 정의한 상수로, 어떤 요청인지 구분하기 위해 사용됩니다.

9. 결론

이번 강좌에서는 인텐트의 기본 개념부터 명시적 및 암시적 인텐트의 사용, 인텐트 필터와 데이터 전달, 플래그 사용 및 결과 처리 방법 등 다양한 내용을 살펴보았습니다. 인텐트는 안드로이드 앱을 설계하는 데 있어 필수적인 요소로, 이번 강좌를 통해 더 나아가 다양한 인텐트를 활용한 앱 개발을 할 수 있기를 바랍니다.

10. 추가 자료

아래는 인텐트에 대한 더 많은 정보를 얻을 수 있는 링크입니다:

이상으로 코틀린을 활용한 안드로이드 앱 개발 강좌, 인텐트 이해하기를 마치겠습니다. 질문이나 의견이 있으시면 댓글로 남겨주세요!