안드로이드 개발에서 가장 중요하면서도 기본적인 개념은 Activity이다. 이 글에서는 Activity란 무엇인지와 기본적인 내용들을 정리했다.
Activity 클래스는 Android 앱의 중요한 구성요소로 활동이 실행되고 결합되는 방식은 플랫폼 애플리케이션 모델의 기본 요소입니다. main() 메서드를 사용하여 앱을 실행하는 프로그래밍 패러다임과 달리 Android 시스템은 수명 주기의 특정 단계에 해당하는 특정 콜백 메서드를 호출하여 Activity 인스턴스의 코드를 시작합니다.
모바일 앱 환경은 사용자와 앱의 상호작용이 항상 동일한 위치에서 시작되는 것이 아니라는 점에서 데스크톱 앱 환경과 다르다.
한 앱이 다른 앱을 호출할 때 호출 앱은 다른 앱을 전체적으로 호출하는 것이 아니라 다른 앱의 Activity를 호출한다. 이런 방식으로 Activity는 앱과 사용자의 상호작용을 위한 진입점 역할을 한다. Activity는 Activity 클래스의 서브클래스로 구현된다.
Activity는 앱이 UI를 그리는 창을 제공한다. 이 창은 일반적으로 화면을 채우지만 화면보다 작고 다른 창 위에 떠 있을 수 있다. 일반적으로 한 Activity는 앱에서 하나의 화면을 구현한다.
Activity가 앱의 일관된 사용자 환경을 형성하기 위해 함께 작동하지만 각 Activity는 다른 Activity에 느슨하게 결합된다. 일반적으로 앱의 Activity 간에는 최소한의 종속성만 있다. 또한 Activity는 다른 앱에 속하는 Activity를 실행할 수도 있다.
앱의 Activity를 사용하려면 manifest에 Activity 및 관련된 특정 속성을 선언해야 앱에서 Activity를 사용할 수 있다.(manifest에 대해서는 나중에 따로 글을 정리해야겠다.ㅠㅠ)
Activity를 선언하려면 manifest 파일을 열고 < activity > 요소를 < application > 요소의 하위 요소로 추가해야 한다.
<manifest ... >
<application ... >
<activity android:name=".ExampleActivity" />
...
</application ... >
...
</manifest >
인텐트 필터를 사용해 명시적 요청뿐만 아니라 암시적 요청을 기반으로도 Activity를 실행하는 기능을 제공한다.
시스템 UI에서 사용자에게 작업을 실행할 때 어떤 앱을 사용할지 묻는 메시지가 표시되면 바로 인텐트 필터가 작동한 것이다.
< activity > 요소에서 < intent-filter > 속성을 선언함으로써 이 기능을 활용할 수 있다. 이 요소의 정의에는 < action > 요소와 선택적으로 < category > 요소 또는 < data > 요소가 포함된다. 이러한 요소를 결합하여 Activity가 응답할 수 있는 인텐트 유형을 지정할 수 있다.
<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>
val sendIntent = Intent().apply {
action = Intent.ACTION_SEND
type = "text/plain"
putExtra(Intent.EXTRA_TEXT, textMessage)
}
startActivity(sendIntent)
앱이 독립적인 상태를 유지하도록 만들고 다른 앱이 앱 Activity를 활성화하지 못하게 하려면 인텐트 필터가 없어야 한다!!!!!
manifest의 < activity > 태그를 사용하여 특정 Activity를 시작할 수 있는 앱을 제어할 수 있다. 상위 Activity와 하위 Activity 모두 각 manifest에서 동일한 권한을 가지고 있지 않다면 상위 Activity가 하위 Activity를 실행할 수 없다. 상위 Activity에서 < uses-permission > 요소를 선언할 때에는 각 하위 Activity에 일치하는 < uses-permission > 요소가 있어야 한다.
<manifest>
<activity android:name="...."
android:permission=”com.google.socialapp.permission.SHARE_POST”
/>
<manifest>
<uses-permission android:name="com.google.socialapp.permission.SHARE_POST" />
</manifest>
Activity는 생명 주기 전체 기간에 걸쳐 여러 상태를 거친다. 상태 간 전환을 처리하는 데 일련의 콜백을 사용할 수 있다.
시스템이 Activity를 생성할 때 실행되는 이 콜백을 구현해야 한다. 구현 시 Activity의 필수 구성요소를 초기화해야 한다.
이 콜백에서 setContentView()를 호출하여 Activity의 사용자 인터페이스를 위한 레이아웃을 정의해야 하며 이 작업이 가장 중요하다.
onCreate()가 종료되면 Activity는 '시작됨' 상태로 전환되고 Activity가 사용자에게 표시된다. 이 콜백에는 Activity가 포그라운드로 나와서 대화형이 되기 위한 최종 준비에 준하는 작업이 포함된다.
Activity가 사용자와 상호작용을 시작하기 직전에 시스템은 이 콜백을 호출한다. 이 시점에서 Activity는 Activity 스택의 맨 위에 있으며 모든 사용자 입력을 캡처한다. 앱의 핵심 기능은 대부분 onResume() 메서드로 구현된다.
Activity가 포커스를 잃고 '일시중지됨' 상태로 전환될 때 시스템은 onPause()를 호출한다.
시스템이 Activity에서 onPause()를 호출할 때 Activity가 여전히 부분적으로 표시되지만 대체로 사용자가 Activity를 떠나고 있으며 Activity가 조만간 '중지됨' 또는 '다시 시작됨' 상태로 전환됨을 나타낸다.
사용자가 UI 업데이트를 기다리고 있다면 '일시중지됨' 상태의 Activity는 계속 UI를 업데이트할 수 있다.
애플리케이션 또는 사용자 데이터를 저장하거나 네트워크를 호출하거나 데이터베이스 트랜잭션을 실행하는 데 onPause()를 사용해서는 안된다!!!!
Activity가 사용자에게 더 이상 표시되지 않을 때 시스템은 onStop()을 호출한다. 이는 Activity가 제거 중이거나 새 Activity가 시작 중이거나 기존 Activity가 '다시 시작됨' 상태로 전환 중이고 중지된 Activity를 다루고 있기 때문에 발생할 수 있다. 이 모든 상황에서 중지된 Activity는 더 이상 표시되지 않는다.
'중지됨' 상태의 Activity가 다시 시작되려고 할 때 시스템은 이 콜백을 호출한다. onRestart()는 Activity가 중지된 시간부터 Activity 상태를 복원한다.
시스템은 Activity가 제거되기 전에 이 콜백을 호출한다.
이 콜백은 Activity가 수신하는 마지막 콜백이다. onDestroy()는 일반적으로 Activity 또는 Activity가 포함된 프로세스가 제거될 때 Activity의 모든 리소스를 해제하도록 구현된다.
안드로이드 개발에서 액티비티는 가장 기본적이면서 중요한 내용이라고 생각한다. 이 글에서는 이러한 액티비티에 대해서 액티비티란 무엇이고 대표적으로 어떤 내용들이 있는지 간단히 소개했다. 아직 자세하게 설명은 하지 않아서 manifest나 인텐트 필터 등은 이해하기 힘들었다...ㅠㅠ 이러한 부분은 나중에 직접 사용하게될 때 자세히 정리해야겠다. 그리고 안드로이드 생명 주기의 여러 콜백들은 우선 이러한 것들이 있다는 정도로 이해하고 넘어가고자한다. 다음 포스팅에서는 안드로이드의 생명 주기를 좀 더 자세하게 포스팅하며 심도있게 공부할 것이다!!!!!