Android

Android - Activity

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

안드로이드 애플리케이션을 개발하다 보면 가장 먼저 마주하게 되는 것이 Activity입니다. Activity는 안드로이드에서 화면을 구성하고 사용자와 상호작용하는 가장 기본적인 컴포넌트입니다. 오늘 포스팅에서는 Activity가 무엇인지, 어떻게 활용할 수 있는지 알아보고, 간단한 예제 코드를 통해 Activity를 직접 구현해 보겠습니다.

Activity란 무엇인가?

Activity는 안드로이드 애플리케이션에서 사용자와 상호작용하는 화면을 담당합니다. 애플리케이션에서 여러 개의 화면을 가질 수 있는데, 각각의 화면이 Activity에 해당합니다. 각 Activity는 애플리케이션의 한 화면을 구성하고, 사용자가 화면을 이동하거나 새로운 기능을 사용할 때마다 새로운 Activity가 실행됩니다.

기본적으로 Activity는 다음과 같은 주요 생명주기 메서드를 가집니다.

  • onCreate(): Activity가 처음 생성될 때 호출됩니다.
  • onStart(): Activity가 사용자에게 표시되기 바로 전에 호출됩니다.
  • onResume(): Activity가 사용자와 상호작용을 시작할 때 호출됩니다.
  • onPause(): 다른 화면이 앞에 나타나면 호출됩니다.
  • onStop(): Activity가 사용자에게 더 이상 보이지 않을 때 호출됩니다.
  • onDestroy(): Activity가 종료될 때 호출됩니다.

이러한 생명주기 메서드를 잘 활용하면 Activity의 상태 변화에 따른 적절한 처리를 할 수 있습니다.

간단한 예제 코드 작성하기

이번에는 간단한 Activity를 만들어 보겠습니다. 이 예제에서는 기본적인 Activity 생성과 생명주기 메서드의 동작을 살펴보겠습니다. 예제 코드는 Kotlin을 사용해 작성했습니다.

package com.example.myfirstapp

import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {

    // 태그 상수 선언
    private val TAG = "MainActivity"

    // onCreate 메서드: Activity가 생성될 때 호출
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        Log.d(TAG, "onCreate called")
    }

    // onStart 메서드: Activity가 사용자에게 보여지기 시작할 때 호출
    override fun onStart() {
        super.onStart()
        Log.d(TAG, "onStart called")
    }

    // onResume 메서드: Activity가 사용자와 상호작용하기 시작할 때 호출
    override fun onResume() {
        super.onResume()
        Log.d(TAG, "onResume called")
    }

    // onPause 메서드: 다른 Activity가 나타나기 직전에 호출
    override fun onPause() {
        super.onPause()
        Log.d(TAG, "onPause called")
    }

    // onStop 메서드: Activity가 더 이상 사용자에게 보여지지 않을 때 호출
    override fun onStop() {
        super.onStop()
        Log.d(TAG, "onStop called")
    }

    // onDestroy 메서드: Activity가 소멸될 때 호출
    override fun onDestroy() {
        super.onDestroy()
        Log.d(TAG, "onDestroy called")
    }
}

위의 코드는 MainActivity라는 기본적인 Activity를 정의합니다. Activity의 생명주기 메서드에서 로그 메시지를 출력하여 각 단계에서 어떤 메서드가 호출되는지 쉽게 추적할 수 있습니다. 이 예제를 실행하면 로그캣(Logcat)을 통해 Activity의 상태 변화에 따라 각 메서드가 언제 호출되는지 확인할 수 있습니다.

AndroidManifest.xml에 Activity 추가하기

Activity를 새로 생성한 후에는 AndroidManifest.xml 파일에 해당 Activity를 등록해야 합니다. AndroidManifest.xml은 애플리케이션의 모든 컴포넌트를 정의하는 파일로, 각 Activity를 시스템에 알려주는 역할을 합니다.

아래는 MainActivityAndroidManifest.xml에 추가하는 예시입니다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myfirstapp">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MyFirstApp">

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- SecondActivity 추가 -->
        <activity android:name=".SecondActivity" />
    </application>

</manifest>

위의 코드에서 <activity> 태그를 사용하여 MainActivity를 추가합니다. intent-filter는 이 Activity가 애플리케이션의 시작 지점임을 나타냅니다. android.intent.action.MAIN은 이 Activity가 메인 진입점임을 의미하며, android.intent.category.LAUNCHER는 애플리케이션 아이콘이 런처에 표시되도록 합니다.

SecondActivity를 추가할 때는 <activity android:name=".SecondActivity" /> 형태로 간단히 추가하면 됩니다. 새로운 Activity를 생성할 때마다 반드시 이와 같이 AndroidManifest.xml 파일에 해당 Activity를 등록해 주어야 합니다.

Activity 생명주기 활용하기

Activity의 생명주기를 이해하는 것은 효율적인 안드로이드 애플리케이션을 개발하는 데 매우 중요합니다. 예를 들어, 다음과 같은 상황에서 생명주기 메서드를 적절히 활용할 수 있습니다.

  • onCreate(): 화면 초기화와 관련된 코드 (예: UI 설정, 초기 데이터 로딩 등)를 작성합니다.
  • onStart(): Activity가 화면에 표시되기 바로 전에 실행할 코드를 작성합니다.
  • onResume(): 사용자가 화면과 상호작용하기 직전에 필요한 준비 작업을 처리합니다. 예를 들어, 센서 데이터 수신을 시작하거나 카메라를 활성화할 수 있습니다.
  • onPause(): 사용자가 Activity를 떠나기 전에 데이터를 저장하거나 리소스를 해제해야 할 때 사용합니다. 예를 들어, 센서 업데이트를 중지하거나 애니메이션을 일시 정지할 수 있습니다.
  • onStop(): Activity가 사용자에게 보이지 않게 될 때, 리소스를 효율적으로 해제하고 데이터를 저장할 수 있습니다.
  • onDestroy(): Activity가 완전히 종료될 때, 모든 남은 리소스를 정리합니다.

Activity 간 데이터 전달하기

대부분의 안드로이드 애플리케이션에서는 여러 개의 Activity를 사용하여 화면 전환을 하고, 서로 간의 데이터를 전달합니다. 이를 위해 Intent를 사용합니다.

다음은 두 개의 Activity 간에 데이터를 전달하는 예제입니다.

MainActivity에서 SecondActivity로 이동하기

먼저 MainActivity에서 버튼 클릭을 통해 SecondActivity로 이동하면서 데이터를 전달해 보겠습니다.

MainActivity 코드:

package com.example.myfirstapp

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

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("EXTRA_MESSAGE", "Hello, Second Activity!")
            startActivity(intent)
        }
    }
}

SecondActivity 코드:

package com.example.myfirstapp

import android.os.Bundle
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity

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<TextView>(R.id.textView)
        textView.text = message
    }
}

위 예제에서 MainActivity는 버튼 클릭 시 Intent를 사용해 SecondActivity로 이동합니다. 이때 putExtra() 메서드를 사용해 데이터를 전달하고, SecondActivity에서는 getStringExtra() 메서드를 사용해 해당 데이터를 수신합니다.

결론

Activity는 안드로이드 애플리케이션의 핵심 구성 요소로, 사용자와의 상호작용을 관리하는 중요한 역할을 합니다. 오늘은 Activity의 기본 개념과 생명주기를 이해하고, 간단한 예제 코드를 통해 Activity를 직접 구현해 보았습니다. 또한, 여러 Activity 간의 데이터 전달 방법에 대해서도 살펴보았습니다.

안드로이드 개발을 처음 접하는 분들에게는 Activity의 생명주기를 이해하고 적절하게 활용하는 것이 매우 중요합니다. 생명주기 메서드의 호출 시점을 잘 파악하고, 상황에 맞는 적절한 처리를 통해 안정적이고 효율적인 애플리케이션을 개발해 보세요.

반응형