안드로이드

[Android] Activity에 대해서... ( feat. Android공식 문서 )

Charlie_moon 2023. 4. 28. 00:54

 

 

안드로이드 공식문서를 읽으면서 내 생각에 중요부분을 정리해보려고 한다.

 

액티비티소개

액티비티는 안드로이드 앱의 중요한 컴포넌트로 액티비티가 실행되고 결합되는 방식은 애플리케이션의 기본 요소이다.

main() 함수를 통해서 앱이 실행되는 프로그래밍 패러다임과 달리 안드로이드는 라이프사이클에 따른 콜백 메서드를 호출 하여 액티비티 인스턴스의 코드를 시작한다.

 

 

 

액티비티의 개념

모바일 앱은 사용자와 상호작용이 항상 동일한 위치에서 시작되는 것이 아니라는 점에서 데스크탑 앱과 다르다. 사용자의 앱 탐색은 동일한 입력이 주어지더라도 매번 다른 과정을 거쳐 다른 결과를 도출하는 비결정론적으로 시작된다. 홈 화면에서 이메일 앱을 실행 시켰을때는 이메일 목록이 나오지만 다른 앱을 통해서 이메일 앱을 실행하면 메일을 작성하는 화면이 나타나도록 하는 것과 같은 예를 들 수 있겠다.

 

액티비티는 이러한 패러다임을 촉진하도록 설계 되었다. A앱이 B앱을 호출할 때 A앱은 B앱의 모든것을 호출한는 것이 아닌 B앱의 특정 액티비티만 호출한다. 이런 방식으로 액티비티는 앱과 사용자의 상호작용을 위한 진입점 역할 을 한다.

 

액티비티는 UI를 그릴 수 있는 Window를 제공한다. 이 Window는 일반적으로 화면을 채우지만 화면보다 작고 다른 Window 위에 떠 있을 수 있다. 일반적으로는 하나의 액티비티는 앱에서 하나의 화면을 구현한다.

 

대부분의 앱은 여러화면을 포함한다. 대부분 여러 액티비티로 구성된다. 일반적으로 앱에서 하나의 액티비티가 기본 액티비티로 지정되며 이 기본 액티비티는 사용자가 앱을 실행할 때 표시되는 첫번째 화면이다. 각 액티비티는 다양한 액티비티를 실행하기 위해 또 다른 액티비티를 실행 할 수 있다. 

 

액티비티가 앱의 일관된 사용자 환경을 형성하기 위해 함께 작동하지만 각 액티비티는 다른 액티비티에 느슨하게 결합된다. 액티비티간에는 최소한의 종속성만 있다. 실제로 액티비티는 흔희 다른 앱에 속하는 액티비티를 시작합니다.

 

앱이 액티비티를 사용하려면 manifest에 액티비티와 관련된 정보를 등록하고 액티비티의 라이프사이클을 적절히 관리해야 한다.

 

 

매니페스트 구성

액티비티 선언

액티비티를 선언하려면 매니페스트 파일을 열고 <activity> 태그요소를 <application> 태그요소의 하위 항목으로 추가해주어야한다.

 

<activity> 태그의 필수 요소는 android:name 이다. 또한 라벨, 아이콘 또는 UI 테마와 같은 액티비티의 특성을 정의하는 속성도 추가할 수 있다.

 

 

인텐트 필터 선언

인텐트 필터는 안드로이드 플랫폼의 매우 강력한 기능이다. 인텐트 필터는 명시적 요청뿐만 아니라 암시적 요청을 기반으로도 액티비티를 실행하는 기능을 제공한다. 명시적 요청은 'A 카메라 앱에서 사진찍는 액티비티를 시작' 하도록 시스템에 지시할 수 있다. 암시적 요청은 '사진을 찍을 수 있는 액티비티로 화면을 시작'하도록 시스템에 지시 한다. 시스템 UI에서 사용자에게 작업을 실행할 때 어떤 앱을 사용할지 묻는 메시지가 표시되면 인텐트 필터가 동작한것이다. 

 

<activity> 태그 요소에서 <intent-filter>태그의 속성을 선언함으로써 이 기능을 활용할 수 있다. 이 요소의 정의에는 <action> 태그 요소와 선택적으로 <category> ,<data> 태그 요소가 포함된다. 이러한 요소를 결합하여 응답 할 수 있는 인텐트 유형을 지정할 수 있다.

 

아래는 텍스트 데이터를 전송하고 다른 액티비티들의 요청을 수신하는 액티비티를 구성하는 방법코드이다.

 

<action> 태그는 이 액티비티가 테이터를 전송하도록 지정합니다.

<category> 태그를 DEFAULT로 선언하면 액티비티가 실행 요청을 수신 할 수 있습니다.

<data> 태그는 액티비티가 전송할 수 있는 데이터 유형을 지정합니다.

 

아래에는 위에서 정의한 액티비티를 호출 하는 코드 입니다.

 

앱이 독립적인 상태를 유지하도록 만들고 다른앱이 앱 액티비티를 활성화하지 못하게 하려면 다른 어떤 인텐트 필터도 필요하지 않는다. 다른 애플리케이션에서 사용하지 못하게 하려는 액티비티는 액티비티에 인텐트 필터가 없어야 하며, 개발자는 명시적 인텐트를 사용하여 액티비티를 직접 시작 할 수 있다.

 

 

권한 선언

매니페스트의 <activity> 태그를 사용하여 특정 활동을 시작할 수 있는 앱을 제어 할 수 있다. 상위 액티비티와 하위 액티비티 모두 각각 매니페스트에서 동일한 권한을 가지고 있지 않다면 상위 액티비티가 하위 액티비티를 실행 할 수 없다. 상위 액티비티에서 <uses-permission> 태그를 선언할 때에는 각 하위 액티비티에 일치하는 <uses-permission> 요소가 있어야한다.

 

아래는 A 카메라 앱의 액티비티가 카메라장치에 접근해 카메라 리소스를 사용하기 위해서 카메라 권한을 지정하는 매니페스트 코드이다.

 

<activity>에 권한에한 정보를 선언하지 않으면 <application> 요소의 권한 속성으로 설정된 권한이 액티비티에 적용 된다. 둘 중 어느 곳에도 권한 속성을 선언하지 않으면 액티비티가 권한으로부터 보호되지 않는다.

 

아래와 같이 앱에서 필요한 권한을 미리 선언해두어야 해당 권한이 필요한 액티비티를 호출 할 수 있다. 

 

 

액티비티 라이프 사이클

액티비티는 라이프사이클 전체 기간에 걸쳐 여러가지 상태를 가지게 된다. 상태간 전환을 처리하는데 일련의 콜백을 사용할 수 있다.

 

onCreate()

시스템이 액티비티를 생성할 때 실행되는 콜백을 구현해야한다. 구현 시  액티비티의 필수 구성요소를 초기화해야한다.

이 콜백에서 setContentView()를 호출하여 액티비티의 사용자 인터페이스를 위한 레이아웃을 정의해야 하며 이 작업이 가장 중요하다.  

onCreate()가 완료되면 다음 콜백으로 onStart()가 호출된다.

 

onStart()

onCreate()가 종료되면 액티비티는 'Started' 라는 상태로 전환되고 액티비티가 사용자에게 표시된다. 이 콜백에는 액티비티가 포그라운드로 나와서 사용자와 상호작용하기 위한 최종 준비가 포함된다.

 

onResume()

액티비티가 사용자와 상호작용하기 직전에 시스템이 이 콜백을 호출한다. 이 시점에서 액티비티는 액티비티 스택의 맨 위에 있으며 모든 사용자 입력을 캡처한다. 대부분의 앱 핵심 기능은 onResume()에 구현된다.

 

onPause()

액티비티가 포커스를 잃고 'Paused' 상태로 전환될 때 시스템은 onPause()를 호출한다. 시스템이 액티비티에서 해당 콜백을 호출할 때 이는 엄밀히 말하면 액티비티가 여전히 부분적으로 표시 되지만 대체로 사용자가 액티비티를 떠나고 있으며 액티비티가 조만간 'Stoped' 또는 'ReStarted' 상태로 전환됨을 나타낸다.

사용자가 UI 업데이트를 기다리고 있다면 'Paused'상태의 액티비티는 계속 UI를 업데이트 할 수 있다. 

애플리케이션 또는 사용자 데이터를 저장하거나 네트워크를 호출하거나 데이터베이스 트랜잭션을 실행한는데 해당 콜백을 사용해서는 안된다.

onPause()가 실행을 완료하면 다음 콜백은 액티비티가 'Paused' 상태로 전환된 후 발생하는 상황에 따라 onStop() 또는 onResume()이 호출된다.

 

onRestart()

'Stoped' 상태의 활동이 다시 시작되려고 할 때 시스템은 이 콜백을 호출한다. 이 콜백은 액티비티가 중지된 시간부터 액티비티 상태를 복원한다.

이 콜백 뒤에 항상 onStart()가 호출된다.

 

onDestroy()

시스템은 액티비티가 제거되기 전에 이 콜백을 호출한다.

이 콜백은 액티비티가 수신하는 마지막 콜백이다. 이 콜백은 일반적으로 액티비티 또는 액티비티가 포함된 프로세스가 제저될 때 액티비티의 모든 리소스를 해제하도록 구현된다.

 

 

 

 

 

 

출처 사이트

 

활동 소개  |  Android 개발자  |  Android Developers

활동은 사용자가 전화 걸기, 사진 찍기, 이메일 보내기 또는 지도 보기와 같은 작업을 하기 위해 상호작용할 수 있는 화면을 제공하는 애플리케이션 구성요소입니다. 각 활동에는 사용자 인터페

developer.android.com