-
Activities안드로이드 학습/Android Developer RoadMap 2023. 5. 18. 17:30
차례: 1. Activity Lifecycles & Activity State Change 2. Task and Back Stack 3. Parcelables and Bundles1. Activity Lifecycles & Activity State Change :
onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy(), onRestart()

1) onCreate()
- 액티비티가 Launch되고 최초 실행될때 호출.
- 생명주기 통틀어서 단 한 번만 수행되는 메소드.
- 필요한 리소스들 초기화
2) onStart()
- Activity가 화면에 표시되기 직전에 호출됨
- 화면에 진입할 때마다 실행되어야 하는 작업을 이곳에 구현함
- BroadcastReceiver는 이 단계에서 등록을 하는것이 좋음.
3) onResume()
- Activity가 화면에 보여지는 직후에 호출됨
- 사용자한테 화면에 보여지고 상호작용하는 메서드이다.
- RecyclerView나 ListView 새로 고침.
- 새로 작성된 내용을 서버에서 불러오려면 여기다 추가. (onCreate는 단 한번만 불러오기 때문에)
4) onPause()
- 사용자가 화면을 떠날 때 시스템이 첫 번째로 이 메서드를 호출한다.
- 현재 Activity가 사용자에게 포커스아웃 되어있는 상태
- 다른 Activity가 호출되기 전에 실행되기 때문에 무거운 작업을 수행하지 않도록 주의해야함
- 일시 정지할 때 필요 없는 리소스 해체하거나 Data는 이곳에 저장 (간단한 데이터 - SharedPreference사용해서)
- https://chebaum.tistory.com/24
- 예: 카메라 미리보기, 배터리 수명에 영향을 미칠 숫 있는 모든 리소스를 해제
5) onStop()
- Activity가 다른 Activity에 의해 100% 가려질 때 호출되는 메소드
- 이 상태에서 Activity가 호출되면, onRestart() 메소드가 호출됨
- 이 메서드에서는 앱이 사용자에게 보이지 않는 동안 앱이 필요하지 않는 리소스를 해제하거나 조정해야 한다
- 정보를 데이터베이스에 저장할 적절한 시기를 찾지 못했다면 onStop() 상태일 때 저장
- 예를 들어 애니메이션을 해제하거나 데이터베이스 저장 작업을 하면 된다.
6) onDestroy()
- Activity가 소멸되기 직전에 호출됨
- Activity가 종료되는 경우
- 사용자: finish(), onBackPressed()
- 시스템: 메모리부족(프로세스 종료)
- onStop(), onDestroy() 메소드는 메모리 부족이 발생하면 스킵될 수 있음
7) onRestart()
- onStop()이 호출된 이후에 다시 기존 Activity로 돌아오는 경우에 호출되는 메소드
- onRestart()가 호출된 이후 이어서 onStart()가 호출됨
코드 :
더보기public class MainActivity extends AppCompatActivity { private String TAG = MainActivity.class.getSimpleName(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d("MainActivity~~", "onCreate"); } @Override protected void onStart() { super.onStart(); Log.d("MainActivity~~", "onStart"); } @Override protected void onResume() { super.onResume(); Log.d("MainActivity~~", "onResume"); } @Override protected void onPause() { super.onPause(); Log.d("MainActivity~~", "onPause"); } @Override protected void onStop() { super.onStop(); Log.d("MainActivity~~", "onStop"); } @Override protected void onDestroy() { super.onDestroy(); Log.d("MainActivity~~", "onDestroy"); } @Override protected void onRestart() { super.onRestart(); Log.d("MainActivity~~", "onRestart"); } }2. Task and Back Stack :
안드로이드에서 'Task'와 'Back Stack'은 앱의 'Activity 인스턴스'를 관리하는 데 사용되는 개념입니다.
1. Task(작업):
- Task는 어플리케이션에서 실행되는 Activity를 보관하고 관리 - Stack 형태의 연속된 Activity로 이루어진다.
- 선입후출(FIFO)형태로 나중에 적재된 액티비티일 수록 가장 먼저 사용된다
- 예를들면 Activity1 -> Activity2-> Activity3 순으로 액티비티를 이동하였을때 실행순서대로 Task에 Push됨
- 뒤로가기 버튼을 누르면 Activity3 -> Activity2 -> Activity1 순으로 Task에서 pop시켜 되돌아간다.
- 최초 적재 액티비티는 'RootActivity' 라고 하며 어플리케이션 런처로부터 시작된다
- 마지막으로 적재되는 액티비티는 'Top Activity' 라고 하며 현재 화면에 활성화 되어있는 액티비티를 말한다.
- Task는 메모리상에 동시에 여러 개가 존재할 수 있으며, 각각 독립적이므로 일반적으로 서로 영향을 주지 않습니다

안드로이드 시스템은 자동으로 태스크를 관리하지만, 런치 모드를 통해 액티비티가 태스크에 관리되는 방식을 설정할 수 있다. 런치모드는 AndroidManifest.xml이나 인텐트의 플래그를 통해 설정할 수 있다.
켜지는 방법을 자체 속성으로 가지고 있는 경우 ➡ launchMode
켜지는 방법을 지시하는 경우 ➡ IntentFlag
launchMode
안드로이드 시스템은 자동으로 task를 관리하지만, launchMode를 통해 액티비티가 태스크에 관리되는 방식을 설정할 수 있다. launchMode는 AndroidManifest.xml이나 인텐트의 플래그를 통해 설정할 수 있다.
설정할 수 있는 모드는 standard, singleTop, singleTask, singleInstance로 4가지가 존재한다.
두가지로 분류할 수 있는데 standard와 singleTop은 액티비티가 여러번 인스턴스화 될 수 있고(singleTop의 경우 조건부), 태스크에 어떤 곳에도 존재할 수 있다.
singleTask와 singleInstance는 단일 인스턴스를 유지하면서 항상 태스크의 루트에 있다.
standard (기본 설정) : 기본적으로 설정되어 있는 모드로 액티비티가 호출될 때 마다 태스크에 저장하기 때문에 여러개가 중첩되서 저장될 수 있다.
singleTop : 액티비티가 이미 태스크의 가장 위에 있을 경우(현재 보이는 액티비티일 경우) onNewIntent()메서드를 통해 기존의 인텐트로 라우팅한다.(액티비티 인스턴스를 재활용) 따라서 가장 위쪽의 액티비티가 다시 생성되지 않는다.
연속되어 중첩되지는 않지만 태스크에 중복되어 저장될 수는 있다.
singleTask : singleTask로 설정된 액티비티가 실행되는 시점에 새로운 태스크를 생성한다. 이 액티비티가 호출하는 액티비티들은 새로 생성된 태스크에 쌓인다. 그리고 다시 호출될 경우 onNewIntent()를 통해 해당 액티비티를 재활용한다.
singleInstance
singleTask와 동일하게 새로운 태스크를 생성한다. singleTask와는 다르게 해당 태스크에서 다른 액티비티를 허용하지 않는다. (다른 액티비티 호출 불가)
IntentFlag
Intent Flag를 포함해서 task관리 방식을 설정할 수 있는데,
Manifest와 동시에 설정할 경우 flag가 더 우선순위가 높다.
FLAG_ACTIVITY_NEW_TASK
새로운 task를 생성해서 저장. singleTask와 동일.

FLAG_ACTIVITY_SINGLE_TOP
task 가장 위쪽의 액티비티일 경우 재활용. singleTop과 동일.

FLAG_ACTIVITY_CLEAR_TOP
activity가 task에 존재한다면, 그 activity 위쪽에 존재하는 모든 activity를 제거하고 해당 액티비티를 활성화한다.

Back Stack
안드로이드 애플리케이션은 모바일 애플리케이션의 특성상 하나의 화면, 즉 Activity만 화면에 활성화가 되게 된다. 활성화 된 화면에서 작업하다가, Back 버튼등을 눌러서 이전화면으로 돌아갈 수 있는데, 이런 돌아가는 구조를 지원하기 위해서, 내부적으로 화면이 전환이 되더라도 기존의 화면을 없애는것이 아니라 메모리에 저장해놨다가, 돌아갈때 저장된 화면을 띄워 주는 구조가 된다.
이런 구조를 구현하기 위해서 내부적으로 BackStack이라는 구조를 사용하는데, 각각의 화면이 Activity이기 때문에, 화면이 전환될때 마다, 그 Activity를 BackStack안에 저장한다. 그리고, Back 버튼등으로 돌아기기를 할 경우에는 Stack에서 하나씩 꺼내서 이전 화면으로 전환을 한다
아래 그림을 보자,- 처음에 Activity 1 화면이 활성화 되었다.
- 다음에 Activity 2가 실행되면, Activity 1이 BackStack에 저장된다.
- 그 다음에 Activity 3이 실행되면, Activity 2가 BackStack에 추가적으로 저장되는 것을 볼 수 있다.
- 이때 Activity 3가 Back 버튼등에 의해서 종료되면, Activity 3는 Destroy 되고, Back Stack에 있던 Activity2 가 활성화 된다.
BackStack의 개념을 대략적으로 이해한후에, Task라는 개념을 이해하는게 좀 어려웠는데, Task하는 하나의 BackStack이라고 생각하면 된다. 그런데 왜 굳이 이 Task라는 개념을 사용하느냐? 아직은 잘 모르겠지만, 글들을 읽어보면 일단 키 포인트는 안드로이드 애플리케이션의 Activity는 서로 다른 application간에 공유가 가능하다.즉, 내가 A라는 애플리케이션을 수행하다가, SNS 공유와 같은 기능을 사용할때, SNS 애플리케이션 B의 Activity들을 불러올 수 있다. 또는 이메일 클라이언트에서, 사진앱의 activity들을 불러서, 첨부 사진을 선택할 수 있다.그렇다보니, 하나의 Activity는 동시에 여러개의 애플리케이션에 의해서 사용될 수 있기 때문에, 다른 개념을 사용하는데, 이를 Task 라고 한다. 현재 실행중인 애플리케이션의 Activity Stack은 이 Task라는 곳에 저장이 되게 된다.3. Parcelables and Bundles :
안드로이드에서 Parcelables와 Bundles은 데이터를 액티비티나 프래그먼트 간에 전달하거나 저장하는 데 사용되는 메커니즘입니다. Parcelable은 안드로이드의 인터페이스로서, 객체를 직렬화(Serialize)하고 역직렬화(Deserialize)하는 데 사용됩니다.
Parcelable을 구현한 객체는 인텐트(Intent)나 번들(Bundle)을 통해 다른 액티비티나 프래그먼트로 전달할 수 있습니다. Parcelable을 사용하면 객체의 상태를 유지하면서 안드로이드 컴포넌트 간에 데이터를 효율적으로 전달할 수 있습니다. Bundle은 키-값 쌍으로 구성된 데이터 컨테이너입니다.
액티비티나 프래그먼트 간에 데이터를 전달할 때, 번들을 사용하여 데이터를 패키징하고 전달할 수 있습니다. 번들은 Parcelable 객체뿐만 아니라 기본 데이터 유형(int, String 등)과 시리얼라이즈 가능한(Serializable) 객체도 포함할 수 있습니다.
번들을 사용하면 여러 데이터를 하나의 객체로 묶어 전달할 수 있습니다. Parcelables와 Bundles은 안드로이드에서 데이터를 전달하고 저장하는 데 유용한 도구로 사용됩니다. Parcelable은 더 효율적이고 빠른 성능을 제공하며, 번들은 다양한 데이터 유형을 처리할 수 있습니다.
'안드로이드 학습 > Android Developer RoadMap' 카테고리의 다른 글
App Components (0) 2023.05.15 Android Platform Archiecture (0) 2023.05.13 Android Operation System (0) 2023.05.10 Android Package : APK, AAB (Application Fundamentals) (0) 2023.05.09 Android Developer Roadmap 2022 (0) 2023.05.08