오늘은 안드로이드 앱 개발에서 매우 중요한 개념인 ‘인텐트(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>
위 코드는 SecondActivity
가 http://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. 추가 자료
아래는 인텐트에 대한 더 많은 정보를 얻을 수 있는 링크입니다:
이상으로 코틀린을 활용한 안드로이드 앱 개발 강좌, 인텐트 이해하기를 마치겠습니다. 질문이나 의견이 있으시면 댓글로 남겨주세요!