반응형
Notice
Recent Posts
Recent Comments
Link
NOW OR NEVER
[Android] 안드로이드 공식 문서 정리 - Activity 개념 본문
반응형
Activity
개념
- 앱의 경우 웹과 다르게 사용자와 앱의 상호작용은 같은 곳에서 이뤄지지 않는다. 그래서 동일한 입력을 하더라도 항상 동일한 출력을 하지 않는다. 예를 들어 홈 스크린에서 이메일 앱을 열면 이메일 목록이 보이며 반대로 sns앱을 사용하다가 이메일 앱을 열면 바로 이메일을 작성하는 화면이 보인다. 앞서 설명한 과정을 용이하기 위해 설계된 것이 Activity이다.
- 사용자와의 앱 상호 작용의 진입점 역할 : 한 앱이 다른 앱을 호출할 때 호출하는 앱은 해당 앱의 다른 액티비티를 호출하며, 앱을 원자적인(원자적인 : 여러 단계로 나눠지지 않고, 중간에 다른 프로세스가 간섭하지 않는 하나의 단위로 수행되는 연산) 전체로 호출하지 않는다.
- UI를 구성할 수 있는 창 제공 : 일반적으로 앱의 하나의 액티비티는 앱의 하나의 화면을 구현한다.
- 앱에는 여러 화면이 포함되어 있으므로 여러 액티비티로 구성된다.
- MainActivity : 사용자가 앱을 시작할 때 처음으로 나타나는 화면
- 각 액티비티는 다른 작업을 수행하기 위해 다른 액티비티를 시작할 수 있다.
- 액티비티들은 일관된 사용자 경험을 형성하기 위해 함께 작동하지만, 각 액티비티는 다른 액티비티에 느슨하게 연결되어 있다.
- 보통 액티비티 간에 최소한의 종속성이 존재한다. (종속성 : 일반적으로 라이브러리, 모듈, 또는 패키지가 다른 코드에 의존하는 상황)
- 액티비티는 다른 앱의 액티비티를 실행시킬 수 있다. ex) 브라우저 앱에서 sns 앱의 ShareActivity를 실행 시킬 수 있다.
- 앱에서 액티비티를 사용하려면 해당 정보를 앱의 manifest에 등록하고, 액티비티 라이프사이클을 적절하게 관리해야 한다
Manifest 설정
1. Activity 선언
- 액티비티를 선언하기 위해선 manifest 파일에 activity 태그를 application 태그의 자식태그로 넣어야 한다.
- android:name 속성 : activity 태그는 해당 속성이 무조건 있어야 한다. 해당 속성은 액티비티의 class Name을 명시한다.
- activity 태그에 label, icon, UI theme 등의 액티비티 특징을 정의하는 속성들을 추가할 수 있다.
- activity 태그 속성 참고 링크 : https://developer.android.com/guide/topics/manifest/activity-element
- 앱 배포 후에는 액티비티 이름을 바꿀 수 없다. 이름을 바꿀 경우 사용자가 앱의 특정 기능에 빠르게 접근하고 실행할 수 있도록 하는 기능 등에서 기능성에 문제가 생길 수 있다. 그 외의 바꿀 수 없는 것들 참고 링크 : https://android-developers.googleblog.com/2011/06/things-that-cannot-change.html
<manifest ... >
<application ... >
<activity android:name=".ExampleActivity" />
...
</application ... >
...
</manifest >
2. Intent Filter 선언
- 인텐트 필터는 안드로이드 플랫폼에서 아주 강력한 기능 중 하나이다.
- UI 상에서 특정 작업을 수행할 어떤 앱을 사용할지 묻는 경우가 Intent Filter 작동하는 경우이다.
- 명시적 요청과 암시적 요청에 기반해 액티비티 시작 가능
- 명시적 요청 ex) 지메일 앱에서 EmailActivity를 시작하라고 시스템에 지시
- 암시적 요청 : 작업을 수행할 수 있는 모든 액티비티에서 이메일 보내기 화면을 시작하라"고 시스템에 알림
- 액티비티 태그 자식 태그로 선언해야 한다.
<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> : 인텐트 필터가 필수적으로 하나 이상 가져야 할 자식 태그
- 표준 : android.intent.action.액션이름 으로 작성
- 사용자 정의 : 패키지 경로.액션이름 ex) com.example.project.액션이름
- <category> : 인텐트 필터의 카테고리 이름 명시
- 표준 : android.intent.category.카테고리이름 으로 작성
- 사용자 정의 : 패키지 경로.카테고리이름 ex) com.example.project.카테고리이름
- <data> : 인텐트 필터의 데이터를 명시
- * 인텐트 관련해서는 추후 https://developer.android.com/guide/components/intents-filters 해당 링크를 참고해 더 자세히 블로그에 다시 정리할 예정
- <action> : 인텐트 필터가 필수적으로 하나 이상 가져야 할 자식 태그
- activity의 intent 호출하는 법
val sendIntent = Intent().apply {
action = Intent.ACTION_SEND
type = "text/plain"
putExtra(Intent.EXTRA_TEXT, textMessage)
}
startActivity(sendIntent)
- 앱이 외부 앱에 의해 호출되지 않고 자체적으로만 활성화되기를 원한다면 해당 액티비티에는 인텐트 필터가 필요없다.
3. Permission 선언
- manifest의 activity 태그를 앱의 특정 액티비티를 실행하기 위한 용도로 사용할 수 있다.
- manifest에서 부모, 자식 두 액티비티가 동일한 permission을 갖고 있지 않는다면 부모 액티비티는 자식 액티비티를 실행할 수 없다. 그래서 만약 부모 액티비티가 android:permission 속성을 통해 권한을 선언한다면 자식 액티비티에도 android:permission 속성을 통해 권한을 선언해 동일한 권한을 선언해줘야 한다.
- 앱 전체에 대한 허용 권한 설정 시 아래 태그를 사용해 설정한다.
<uses-permission android:name="권한경로.권한이름" />
Lifecycle 관리
- activity 자체의 수명주기 동안 액태비티는 다양한 상태를 거친다. 상태들의 전환을 위해 여러 개의 callback 함수들을 사용한다.
- callback 함수 종류
- onCreate()
- 액티비티를 생성시 이 콜백 함수가 반드시 호출되어야 한다.
- 해당 함수 안에서 액티비티의 필수 구성 요소들을 초기화해야 한다.
- 뷰를 생성하거나 리스트에 데이터를 연결하는 작업 등을 한다.
- 중요! 해당 함수 안에서 setContentView() 함수를 사용해서 액티비티의 UI의 레이아웃을 정의해야한다.
- 해당 함수가 끝나고 다음 콜백함수는 항상 onStart() 콜백 함수이다.
- onStart()
- onCreate()가 끝나면 액티비티는 시작 상태로 진입하며 유저에게 보이기 시작한다.
- 해당 콜백 함수는 액티비티가 화면 상단으로 나오고 상호작용이 가능해지기 전의 마지막 준비 작업이 포함되어 있다.
- onResume()
- 액티비티가 유저와 상호작용하기 직전에 해당 콜백함수를 호출한다.
- 호출 시 액티비티는 액티비티 스택의 맨위에 위치해 있으며 모든 사용자의 입력을 포착한다.
- 대부분의 앱의 핵심적인 기능은 해당 콜백 함수에서 구현된다.
- onPause() 콜백은 항상 onResume() 다음에 호출된다.
- onPause()
- 시스템은 액티비티가 포커스를 잃고 일시 중지된 상태로 전환될 때 onPause()를 호출한다.
- 이 상태는 사용자가 뒤로가기 또는 최근 앱 버튼을 탭하는 경우와 같이 발생한다.
- 시스템이 액티비티에 대해 onPause()를 호출한다는 것은 기술적으로 액티비티가 여전히 부분적으로 보이지만 대부분의 경우 사용자가 액티비티를 떠나고 액티비티가 곧 중지된 상태 또는 재개된 상태로 전환될 것을 나타낸다.
- 일시 중지된 상태의 액티비티는 사용자가 UI 업데이트를 기대하는 경우 UI를 계속 업데이트할 수 있다. ex) 내비게이션 지도 화면, 영상 플레이어 등
- onPause()를 사용하여 애플리케이션 또는 사용자 데이터를 저장하거나 네트워크 호출 또는 데이터베이스 작업을 하면 안된다.
- onPause()의 실행이 완료되면 다음 콜백함수는 액티비티가 일시 중지된 상태에서 어떤 일이 발생하는지에 따라 onStop() 또는 onResume() 함수를 호출 할 수 있다.
- onStop()
- 액티비티가 사용자에게 더 이상 보이지 않을 때 onStop()을 호출
- 액티비티가 파괴되고 있는 경우, 새로운 액티비티가 시작되고 있는 경우, 또는 기존 액티비티가 다시 재개되어 중단된 액티비티를 덮고 있는 경우 해당 함수 호출한다. 앞서 말한 모든 경우를 통해 중단된 액티비티는 더 이상 화면에 보이지 않는다.
- 해당 함수의 다음 콜백 함수는, 액티비티가 사용자와 상호작용하려고 다시 돌아가는 경우에는 onRestart() 콜백 함수를 호출하고, 액티비티가 완전히 종료되는 경우에는 onDestroy() 콜백 함수를 호출한다.
- onRestart()
- 액티비티가 재시작하기 직전 중단 상태일 때 해당 함수를 호출한다.
- 액티비티의 상태를 중지되기 이전의 상태로 복원하는 역할을 한다.
- onRestart() 콜백은 항상 onStart() 다음에 호출된다.
- onDestroy()
- 이 콜백 함수는 액티비티가 파괴(액티비티가 더 이상 필요하지 않거나 메모리 관리 등의 이유로 시스템에 의해 완전히 종료) 되기 전에 호출된다.
- 해당 함수는 액티비티가 받는 마지막 콜백 함수이다.
- 일반적으로 액티비티나 해당 액티비티를 포함하는 프로세스가 파괴될 때 액티비티의 모든 리소스가 해제되도록 보장하기 위해 구현된다.
- onCreate()
참고
'Android' 카테고리의 다른 글
[Android] 키보드에 요소 가려지는 현상 해결 (0) | 2023.12.17 |
---|---|
[Android] Retrofit 서버 통신 값 null로 올 시 처리 (0) | 2023.12.17 |
[Android] Hilt (0) | 2023.10.14 |
[Android] properties 값을 Manifest 및 다른 파일에서 사용하기 (0) | 2023.09.13 |
[Android] TimePicker Interval 설정 (0) | 2023.09.12 |
Comments