Activity
Activity 클래스는 Android 앱의 중요한 구성요소로 활동이 실행되고 결합되는 방식은 플랫폼 애플리케이션 모델의 기본 요소이다.
main() 메서드를 사용하여 앱을 실행하는 패러다임과 달리 Android 시스템은 수명 주기의 특정 단계에 해당하는 특정 콜백 메서드를 호출하여 Activity 인스턴스의 코드를 시작한다.
Activity 개념
모바일 앱 환경은 사용자와 앱의 상호자굥이 항상 동일한 위치에서 시작되는 것이 아니라는 점에서 데스크톱 앱 환경과 다르다.
사용자는 항상 다르게 앱을 실행하게 된다.
ex) 홈 화면에서 이메일 앱을 열면 이메일 목록이 표시될 수 있으나, 소셜 미디어 앱을 사용하고 있는 상태에서 이메일 앱을 실행하게 되면 이메일을 작성하기 위한 이메일 앱 화면으로 바로 이동할 수 있다.
Activity
클래스는 이 패러다임을 촉진하도록 설계되었다.
한 앱이 다른 앱을 호출 할 때 호출 앱은 다른 앱을 전체적으로 호출 하는 것이 아니라 다른 앱의 Activity 를 호출한다.
이런 방식으로 Activity는 앱과 사용자의 상호작용을 위한 진입점 역할을 한다.
Activity 는 앱이 UI 그리는 창을 제공한다. 이 창은 일반적으로 화면을 채우지만 화면보다 작고 다른 창 위에 떠있을 수 있다. 일반적으로 한 Activity 는 앱에서 하나의 화면을 구성한다.
대부분의 앱에는 다수의 Activity 가 포함되어있다. 즉, 대부분의 앱은 여러 Activity 로 구성되어 있다.
manifest 구성
Activity 선언
Activity를 선언하려면 manifest 파일을 열고 <activity>
를 <application>
의 아래로 추가해야 한다.
<manifest ... > <application ... > <activity android:name=".ExampleActivity" /> ... </application ... > ... </manifest >
여기에서 유일한 필수 속성은 클래스 이름을 지정하는 android:name
이다. 또한, 라벨 아이콘 또는 UI 테마와 같은 Activity 특성을 정의하는 속성도 추가 할 수 있다.
Intent filter 선언
인텐트 필터는 Andorid 플랫폼의 매우 강력한 기능이다. 인텐트 필터는 명시적 요청뿐만 아니라 암시적 요청을 기반으로도 활동을 실행하는 기능을 제공한다.
<activity>
요소에서 <intent-filter>
속성을 선언함으로써 이 기능을 활용할 수 있다. 이 요소의 정의에는 <action>
요소와 선택적으로 <category>
요소 또는 <data>
요소가 포함된다. 이러한 요소를 결합하여 활동이 응답할 수 있는 인텐트 유형을 지정할 수 있다.
<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>
위의 예에서 <action>
요소는 이 Activity가 데이터를 전송하도록 지정한다. <category>
요소를 DEFAULT
로 선언하면 Activity가 실행 요청을 수신할 수 있다. <data>
요소는 이 Activity가 전송할 수 있는 데이터 유형을 지정한다.
val sendIntent = Intent().apply { action = Intent.ACTION_SEND type = "text/plain" putExtra(Intent.EXTRA_TEXT, textMessage) } startActivity(sendIntent)
앱이 독립적인 상태를 유지하도록 만들고 다른 앱이 활동을 활성화하지 못하게 하려면 어떠한 Intent filter 도 필요로하지 않다. 다른 애플리케이션에서 사용하지 못하게 하려는 활동에는 인텐트 필터가 없어야 하며, 개발자는 명시적 인텐트를 사용하여 Activity 를 직접 시작할 수 있다.
권한 선언
manifest의 <activity>
태그를 사용하여 특정 활동을 시작할 수 있는 앱을 제어할 수 있다. 상위 활동과 하위 활동이 모두 각 manifest 에서 동일한 권한을 가지고 있지 않다면 상위 활동이 하위 활동을 실행할 수 없다. 상위 활동에서 <users-permission>
요소를 선언할 때에는 각 하위 활동에 일치하는 <uses-permission>
요소가 필요하다.
Life Cycle
onCreate()
시스템이 Activity을 생성할 때 실행되는 이 콜백을 구현해야 하낟. 구현 시 Activity의 필수 구성요소를 초기화해야 한다. 예를 들어 앱은 여기에서 뷰를 생성하고 데이터를 목록에 결합해야 한다. 이 콜백에서 setContentView()
를 호출하여 Activity의 사용자 인터페이스를 위한 레이아웃을 정의해야 하며 이 작업이 가장 중요하다.
onCreate()
가 완료되면 다음 콜백은 항상 onStart()
이다.
onStart()
onCreate()
가 종료되면 Activity는 '시작됨' 상태로 전환되고 Activity가 사용자에게 표시된다. 이 콜백에는 활동이 포그라운드로 나와서 대화형이 되기 위한 최종 준비에 준하는 작업이 포함된다.
onResume()
Activity가 사용자와 상호작용을 시작하기 직전에 시스템은 이 콜백을 호출한다. 이 시점에서 Activity는 Activity스택의 맨 위에 있으며 모든 사용자 입력을 캡쳐한다. 앱의 핵심 기능은 대부분 onResume()
메서드에서 구현된다.
onPause()
콜백은 항상 onResume()
뒤에 온다.
onPause()
Activity가 포커스를 잃고 '일시중지됨' 상태로 전환될 때 시스템은 onPause()
을 호출한다. 이는 Activity이 제거 중이거나 새 Activity가 시작 중이거나 기존 Activity이 '다시 시작됨' 상태로 전환 중이고 중지된 Activity를 다루고 있기 때문에 발생할 수 있다. 이 모든 상황에서 중지도니 Activity은 더 이상 표시되지 않는다.
시스템이 호출하는 다음 콜백은 활동이 사용자와 상호작용 하기 위해 다시 시작되면 onRestart()
이며 이 Activity이 완전이 종료되면 onDestory()
이다.
onRestart()
'중지됨' 상태의 Activity가 다시 시작되려고 할 때 시스템은 이 콜백을 호출한다. onRestart()
는 활동이 중지된 시간부터 활동 상태를 복원한다.
이 콜백 뒤에 항상 onStart()
가 온다.
onDestory()
시스템은 Activity가 제거디기 전에 이 콜백을 호출한다
이 콜백은 Activity가 수신하는 마지막 콜백이다. onDestory()
는 일반적으로 Activity 또는 Activity이 포함된 프로셋가 제거될 때 활동의 모든 리소스를 해제하도록 구현된다.
Uploaded by Notion2Tistory v1.1.0