본문 바로가기

안드로이드/[Kotlin]

[Kotlin] Activity 전환 & 데이터 전달 (Intent, putExtra...)

우선 시작하기 전 안드로이드의 4대 구성요소에 대해 알아보자.

 

- 1. Activity

  • 사용자에게 보여주는 UI 화면을 구성하는 컴포넌트이다. (웹의 HTML 같은 느낌)
  • Activity 클래스를 상속받아 사용한다. 
  • 하나의 어플리케이션에 최소 1개 이상의 Activity가 존재해야 한다.
  • 사용하려면 manifest에 선언 해야한다.
  • 화면 UI구성 이외에 앱의 동작을 구현하는 Java나 Kotlin 코드 부분도 필요하다.

 

- 2. Service

  • 프로세스와 같은 의미의 컨포넌트이다. 항상 백그라운드에서 프로세스가 돌고, 여러 일들을 처리한다.
  • 화면이 존재하지 않고, Background에서 실행되는 컴포넌트이다. 따라서 UI가 없다.
  • Service 클래스를 상속받아 사용한다.
  • 사용하려면 manifest에 선언 해야한다.
  • 네트워크 작업을 통해서 데이터를 가져올 수 있다. (ex. 배경음악)

 

- 3. Broadcast Receiver

  • 안드로이드 단말기에서 발생하는 이벤트나 정보를 받고 처리하는 컴포넌트이다.
  • 단말기에서 발생하는 일 중에서 어플리케이션이 알아야 하는 상황이 발생하면 알려준다. (ex. 배터리 부족, wifi 설정, 문자수신...)
  • BroadcastReceiver 클래스를 상속받아 사용한다.

 

- 4. Content Provider

  • 어플리케이션 사이에서 data를 주고받을 수 있게 도와주는 컴포넌트이다.
  • ContentProvider 클래스를 상속받아서 사용한다.
  • 안드로이드는 주소록, 이미지, 오디오 등의 Content Provider를 제공한다.

Intent 란??

위에서 말한 4개의 컴포넌트들은 오가면서 data를 주고받고 통신할 수 있도록 해 주는 메세지 객체이다. 예를들어 독립적인 Activity들 사이에서 data를 주고 받거나, 다른 Activity를 호출할 수 있다. 한마디로 정리하면 Intent란 앱에서 무엇인가 작업을 수행하기 위해 사용하는 전달수단 과 같은 것이다.   

추가적으로 Intent는 내가 만들지 않은 다른 어플리케이션의 기능들 또한 수행할 수 있다.

 

인텐트에는 명시적 인텐트, 암시적 인텐트. 이렇게 2가지 종류가 있다. 

 

명시적 인텐트

인텐트에 클래스 객체나 컴포넌트 이름을 지정하여 호출하는 Activity나 Service의 이름을 확실히 아는 경우에 사용한다. 주로 같은 어플리케이션 내부에서 사용한다. 특정 컴포넌트나 액티비티가 명확하게 실행되어야할 경우사용한다.

 

아래의 예시를 보자.

 

<MainActivity.kt>

package com.example.intentkt

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.intentkt.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        val intent = Intent(this, SubActivity::class.java)
        binding.btnA.setOnClickListener {
            //다음 화면으로 이동하기 위한 intent 객체 생성
            val msg: String = binding.etSendMsg.text.toString()
            intent.putExtra("msg", msg)
            startActivity(intent)
        }
        binding.btnB.setOnClickListener {
            startActivity(intent)
        }
    }
}

 

<SubActivity.kt>

package com.example.intentkt

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.intentkt.databinding.ActivitySubBinding

class SubActivity : AppCompatActivity() {

    private lateinit var binding: ActivitySubBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivitySubBinding.inflate(layoutInflater)
        setContentView(binding.root)
        if (intent.hasExtra("msg")) {
            val getMsg = intent.getStringExtra("msg")
            binding.tvGetMsg.text = getMsg
        }
        binding.btnToMain.setOnClickListener {
            val subIntent = Intent(this, MainActivity::class.java)
            startActivity(subIntent)
        }
    }
}

Intent를 통해 액티비티를 전환할 때에 putExtra를 통해 String이나 Int 등 간단한 데이터를 전달할 수 있다. putExtra(key: Id, value: 간단한 데이터) 의 형식을 띤다.

그리고 hasExtra(key: Id) 를 통해 Intent 객체를 통해서 데이터 값이 넘어왔는지 확인할 수 있고, getStringExtra(key: Id) 를 통해 넘어온 문자열 형태의 데이터 값을 받을 수 있다.

 

 

위의 코드와 아래의 실행화면을 비교해 가면서 공부하도록 하자.

 

1. MainActivity,kt                                       2. SubActivity.kt                                      3. SubActivity.kt

   

 

 

 

암시적 인텐트

인텐트의 액션과 데이터를 지정했지만, 호출할 대상이 달라질 수 있는 경우에는 암시적 인텐트를 사용한다.

즉 설치된 애플리케이션들에 대한 정보를 알고 있는 안드로이드 시스템이 인텐트를 이용해 요청한 정보를 처리할 수 있는 적절한 컴포넌트를 찾아본 다음 사용자에게 그 대상과 처리 결과를 보여주는 과정을 거치게 된다.

 

암시적 인텐트를 사용하는 대표적인 경우로 문서편집기를 예로 들 수 있다.

카톡을 하다가 누군가 자신이 보낸 문서를 봐 달라며 PDF 파일을 첨부할 때, 우리는 그 PDF 파일을 클릭하여 열기를 하면 해당 안드로이드 폰에 PDF를 편집하거나 보여줄 수 있는 많은 애플리케이션이 내가 그 PDF파일을 보여줄 수 있다고 신호를 준다. 그러면 안드로이드 시스템에서는 'PDF 파일을 열 수 있는 앱들이 이렇게 많은데 뭘 선택할래?' 라고 어플리케이션을 선택할 수 있는 위젯을 띄운다. 이런 일련의 과정을 가능하게 하는 녀석이 암시적 인텐트 이다.

 

그런데 왜 굳이 암시적 인텐트를 써야할까? PDF 파일을 열기위해 이미 많은 PDF 리더 앱들이 존재하는데 굳이 PDF 리더 어플을 만드는 것은 현실적으로 좋은 방법이 아니다. 따라서 이미 기존에 어떤 기능들을 지원하는 앱들이 있는 경우에 암시적 인텐트를 사용해서 그 앱들을 사용하면 된다.★

 

 

 

 

 

 

참고 : https://limkydev.tistory.com/35