Activtiy는 안드로이드 4대 컴포넌트 중 하나로 사용자와 상호작용을 하는 UI를 제공하는 역할을 한다.
보통 앱은 여러 화면으로 구성되어 있어 여러 액티비티로 구성되어있다고 할 수 있다. 예를 들어 앱을 시작할 때 나오는 로그인 화면, 로그인을 했을 때 이동하는 메인화면 등 모두 각각의 액티비티들이다.
액티비티를 생성하면 kotlin(java) 클래스 파일과 xml파일이 함께 생성된다. xml파일은 UI를 만드는 파일이며, 클래스 파일은 xml파일에 만들어놓은 버튼 등 UI에 기능을 붙여 여러 동작이 가능하도록 만들 수 있다.
액티비티에는 생명 주기가 있다. 생명주기란 액티비티가 생성되어 소멸하기까지의 과정을 말하며 액티비티 클래스는 액티비티가 상태 변화를 알아차릴 수 있는 여러가지 콜백 함수를 제공한다.
왜 액티비티에 생명 주기를 만들었을까? 카카오톡으로 카톡을 하다가 유튜브 앱을 켜고 동영상을 보다가 네이버 앱을 켜서 뉴스 좀 보다가 다시 카톡을 한다.
이때 앱은 종료되고 다시 켜지는 것이 아니라 다른 앱을 켜기 전의 화면으로 다시 돌아간다. 또한 뒤로 가기 버튼을 눌러도 이전 화면이 유지된 채로 보인다.
사용자는 화면에서 안 보이는 순간 앱이 종료될 것이라고 생각하지만 그렇지 않다. 이처럼 액티비티는 단순하게 화면에서 사라진다고 해서 종료되는 것이 아니며, 사용자가 어떤 액션을 취했는지(뒤로 가기, 홈버튼, 다른 앱으로 전환 등)에 따라 앱을 재실행했을 때 보이는 화면과 데이터가 달라야 한다. 또한 앱이 비정상적으로 강제 종료될 때도 데이터를 백업할 시간이 필요한데, 이럴 때 액티비티 생명주기를 활용해서 처리할 수 있다.

OnCreate는 액티비티가 실행될 때 딱 한 번만 실행된다. 처음 액티비티가 실행되면 view를 생성하고, onCreate에서 처리해야 할 일이 완료되면 OnStart, OnResume을 순서대로 실행한다.
OnStart는 화면에 표시되기 직전 단계로 주로 통신하거나 센서 처리가 필요할 때 사용한다. 그리고 UI를 관리하는 코드를 초기화한다.
OnResume은 사용자에게 화면이 보이는 단계이다. OnResume에서 사용자와 상호작용을 한다. 그리고 사용자가 다른 앱을 실행하거나 앱 종료, 화면이 꺼지기 등 방해 요소가 있기 전까지는 OnResume상태에 머무른다.
OnRestart는 조금 특이한 형태로, OnStop에서 사용자가 다른 액티비티를 호출하고 다시 돌아오는 경우 OnRestart가 호출된다. 그리고 OnStart-OnResume을 거쳐 사용자에게 화면을 다시 보여준다.
OnPause단계는 OnResume단계에서 방해 요소가 발생하면 OnPause단계로 넘어간다. OnPause단계에서 사용자가 다시 화면으로 돌아가면 OnResume을 호출하여 화면을 보여준다.
OnStop은 다른 액티비티가 현재 화면 전체를 가리거나, 액티비티가 중지될 때 호출된다. OnStop에서는 메모리가 부족한 경우, 강제 종료되어 OnCreate를 다시 호출하는 경우와 사용자가 다른 액티비티를 호출하여, 다시 돌아오는 경우 OnRestart를 호출하고 OnStart과정부터 시작하는 경우로 나뉜다.
OnDestroy는 View를 폐기하고, 액티비티를 실행하면서 사용한 리소스를 해제한다. 메모리에서 완전히 view를 폐기하는 단계로, OnDestory가 호출되면 앱이 완전히 종료되었다고 할 수 있다.
activity를 생성하는 방법은 총 2가지가 있다. 안드로이드 스튜디오에서 new-activity로 추가하는 방법과, 직접 클래스 파일과 xml파일을 만들어 추가하는 방법이 있다.

첫 번째 방법으로 액티비티를 추가하면 클래스 파일과 xml연결, manifest추가 모두 알아서 생성해 준다.

하지만 클래스 파일과 xml파일을 직접 생성했다면, 이 파일들을 연결해주고 manifest에 activity를 추가해주어야 한다.
클래스 파일과 xml파일을 생성했다면, 클래스 파일과 xml파일을 연결해줘야 한다. 위 그림과 아래 코드들은 MainActivity.kt파일과 activity_main.xml파일을 만들었다고 가정한다. MainActivity.kt와 activity_main.xml파일을 연결하려면 MainActivity.kt의 onCreate메서드 안에 setContentView(R.layout.activity_main) 코드를 넣어주면 된다.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
클래스 파일과 xml파일을 연결했다면, 액티비티를 사용할 수 있도록 manifest.xml파일에 액티비티 정보를 추가해주어야 한다.
아래 코드에서는 MainActivity하나만 등록되어있지만, 앱을 만들면서 액티비티를 추가하면 manifest.xml에도 액티비티가 추가된다.
안드로이드 스튜디오에서 activity를 추가하면 manifest파일에 자동으로 등록된다. 하지만 클래스에 직접 activity를 상속받고 xml을 연결했다면 직접 manifest파일에 등록해줘야 한다.
<manifest ... >
<application ... >
<activity android:name="com.example.myapp.MainActivity" ... >
</activity>
</application>
</manifest>
그리고 인텐트 필터(intent filter)를 설정해준다.
인텐트란 메시지 객체로 액티비티끼리 통신을 하기 위해 사용한다. 특정 화면에서 다음 화면으로 넘어갈 때 인텐트를 사용하며, 인텐트로 다음 화면에 필요한 정보들을 포함하여 함께 보낼 수도 있다.
인텐트 필터는 어떤 인텐트를 받을지 '필터'의 역할을 한다. 인텐트 필터에는 action, category, data 속성으로 구성되어 있는데 이 속성들로 어떤 데이터를 전송하고, 어떤 데이트를 보낼지 등을 선택할 수 있다. 우리가 앱을 만들기 위해 프로젝트를 생성하면 MainActivity가 생성되는데, 이 MainActivity에 인텐트 필터가 적용되어 있고, 속성에 ACTION_MAIN이 적용되어 있다. ACTION_MAIN은 앱을 시작할 때 시작할 액티비티를 지정하는 액션이다.
<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity>