이 강좌에서는 코틀린을 사용하여 안드로이드 앱 개발 시 액티비티를 제어하는 방법에 대해 깊이 있는 설명과 실습 예제를 제공합니다.
1. 액티비티(Activity)란?
액티비티는 안드로이드 앱의 UI를 구성하는 기본적인 컴포넌트입니다. 각 액티비티는 사용자와 상호작용하는 단일 화면을 나타내며, 여러 액티비티를 사용하여 앱의 기능을 구현합니다.
예를 들어, 로그인 화면, 메인 화면, 설정 화면 등이 각각 독립적인 액티비티로 구성될 수 있습니다. 각 액티비티는 생명주기(lifecycle)를 가지며, 이는 앱의 상태 변화를 관리하는 데 중요한 역할을 합니다.
2. 액티비티의 생명주기
액티비티의 생명주기는 다음과 같은 주요 메서드들로 구성됩니다:
- onCreate(): 액티비티가 생성될 때 호출됩니다. UI를 초기화하고, 필요한 데이터 및 리소스를 설정하는 데 사용됩니다.
- onStart(): 액티비티가 사용자에게 보이기 시작할 때 호출됩니다.
- onResume(): 액티비티가 포그라운드에 올 때 호출됩니다. 사용자와의 상호작용을 시작할 수 있는 지점입니다.
- onPause(): 다른 액티비티가 시작되기 전에 현재 액티비티가 중단될 때 호출됩니다. 이 때 필요한 데이터 저장 작업을 수행합니다.
- onStop(): 액티비티가 더 이상 보이지 않게 될 때 호출됩니다.
- onDestroy(): 액티비티가 종료될 때 호출됩니다. 리소스를 해제하는 작업을 수행할 수 있습니다.
이 생명주기 메서드들을 적절히 활용하면, 앱의 상태를 효과적으로 관리할 수 있습니다.
3. 기본 액티비티 생성하기
이제 간단한 안드로이드 앱을 만들어 보겠습니다. Kotlin으로 기본 액티비티를 생성하는 방법을 살펴보겠습니다.
3.1 프로젝트 생성하기
Android Studio를 열고 새로운 프로젝트를 생성합니다. 프로그래밍 언어로 Kotlin을 선택하고, 기본 템플릿인 Empty Activity를 선택합니다. 프로젝트 이름은 HelloWorld로 설정하겠습니다.
3.2 액티비티 코드 작성
package com.example.helloworld
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
override fun onStart() {
super.onStart()
// 액티비티가 시작될 때 수행할 작업
}
override fun onResume() {
super.onResume()
// 액티비티가 포그라운드에 있을 때 수행할 작업
}
override fun onPause() {
super.onPause()
// 액티비티가 중단될 때 수행할 작업
}
override fun onStop() {
super.onStop()
// 액티비티가 더 이상 보이지 않을 때 수행할 작업
}
override fun onDestroy() {
super.onDestroy()
// 액티비티가 종료될 때 수행할 작업
}
}
위의 코드에서 우리는 MainActivity 클래스를 생성하고, 다양한 생명주기 메서드를 오버라이드하여 각 상태에서 수행할 작업을 정의했습니다.
3.3 XML 레이아웃 설정
이제 UI를 정의하기 위해 activity_main.xml 파일을 수정해보겠습니다.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:layout_centerInParent="true" />
</RelativeLayout>
위의 XML 코드에서 우리는 TextView를 사용하여 “Hello World!”라는 텍스트를 화면 중앙에 표시했습니다.
4. 액티비티 간 이동
안드로이드 앱에서는 보통 여러 개의 액티비티를 사용하여 사용자 인터페이스를 구성하는 경우가 많습니다. 이 섹션에서는 액티비티 간 이동하는 방법을 살펴보겠습니다.
4.1 새 액티비티 생성
새로운 액티비티를 추가하겠습니다. SecondActivity라는 이름의 액티비티를 생성하고, 내용물은 다음과 같이 설정합니다.
package com.example.helloworld
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
}
}
4.2 XML 레이아웃 설정
그에 따른 XML 레이아웃인 activity_second.xml 파일도 수정합니다.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="This is the Second Activity"
android:layout_centerInParent="true" />
</RelativeLayout>
4.3 액티비티 전환 코드 추가
이제 MainActivity에서 SecondActivity로 이동할 수 있는 코드를 추가하겠습니다. 버튼을 만들고 클릭했을 때 새로운 액티비티로 전환되도록 설정합니다.
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Go to Second Activity"
android:layout_below="@id/textView"
android:layout_centerHorizontal="true"/>
// MainActivity 코드의 onCreate 메서드에 추가
val button: Button = findViewById(R.id.button)
button.setOnClickListener {
val intent = Intent(this, SecondActivity::class.java)
startActivity(intent)
}
버튼을 클릭하면 SecondActivity로 전환됩니다.
5. 액티비티 결과 전달하기
액티비티 간에 데이터를 전달하는 것도 중요한 기능 중 하나입니다. 결과를 반환하는 방법에 대해 설명합니다.
5.1 결과를 반환받는 액티비티 설정
먼저, SecondActivity에서 결과를 반환하도록 수정합니다.
// SecondActivity 코드
button.setOnClickListener {
val resultIntent = Intent()
resultIntent.putExtra("result", "Result from Second Activity")
setResult(RESULT_OK, resultIntent)
finish()
}
5.2 결과를 받는 액티비티 설정
이제 MainActivity에서 결과를 받을 수 있도록 수정합니다.
// MainActivity 코드에 추가
val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
val data: Intent? = result.data
val resultText = data?.getStringExtra("result")
// TextView에 결과 설정
}
}
button.setOnClickListener {
val intent = Intent(this, SecondActivity::class.java)
startForResult.launch(intent)
}
이제 MainActivity는 SecondActivity로부터 결과를 받을 수 있으며 이를 UI에 반영할 수 있습니다.
6. 액티비티의 플래그(flag) 설정
안드로이드에서는 액티비티를 시작할 때 인텐트의 플래그를 설정하여 액티비티의 동작 방식을 제어할 수 있습니다.
가장 많이 사용되는 플래그 중 일부는 다음과 같습니다:
- FLAG_ACTIVITY_NEW_TASK: 새로운 태스크에서 액티비티를 시작합니다.
- FLAG_ACTIVITY_CLEAR_TOP: 스택에 있는 기존 액티비티를 제거하고 그 위에 있는 액티비티를 시작합니다.
6.1 플래그 예제
val intent = Intent(this, SecondActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
startActivity(intent)
위의 코드에서 FLAG_ACTIVITY_CLEAR_TOP을 사용하면 SecondActivity를 시작할 때 스택에 있는 기존 액티비티가 제거됩니다.
7. 액티비티 테마 및 스타일 적용하기
액티비티에 다양한 테마와 스타일을 적용하여 UI를 조정할 수 있습니다. 여기서는 커스텀 테마를 만들어 적용하는 방법에 대해 설명합니다.
7.1 테마 설정하기
res/values/styles.xml 파일을 열고 새로운 테마를 추가합니다.
<style name="CustomTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">#FF5722</item>
<item name="colorPrimaryDark">#E64A19</item>
<item name="colorAccent">#FFC107</item>
</style>
7.2 테마 적용하기
AndroidManifest.xml 파일에서 MainActivity에 새로운 테마를 적용합니다.
<activity
android:name=".MainActivity"
android:theme="@style/CustomTheme">
</activity>
위의 코드에서 CustomTheme를 설정하여 액티비티에 적용하였습니다.
8. 액티비티 종료
액티비티를 종료하는 방법에는 여러 가지가 있습니다. 기본적으로 finish() 메서드를 호출하여 현재 액티비티를 종료할 수 있습니다.
사용자가 뒤로가기 버튼을 눌렀을 때 액티비티가 종료되도록 자동으로 처리된다는 점도 유의해야 합니다.
button.setOnClickListener {
finish()
}
위의 코드에서 버튼을 클릭하면 현재 액티비티가 종료됩니다.