-
Activity와 Fragment 그리고 생명주기안드로이드 학습/Android 기술면접 대비 2023. 6. 12. 21:56
차례: 1. Activity란? 2. Fragment란? 3. Fragment 와 Activity의 차이점? 4. Activity 생명주기 5. Fragment 생명주기
1. Activity란 :
- Activity는 Android의 4대 Component중 하나로 사용자에게 실제로 보이며, 사용자와 상호작용하는 화면을 말한다.
- Activity는 하나 이상의 View또는 ViewGroup을 반드시 가지고 있어야 하며, 한 번에 하나의 Activity만 Disaplay할 수 있다.
더보기여기서 View와 ViewGroup이란
안드로이드 화면은 view와 viewgroup 구성되어 있다. 안드로이드 앱을 실행시켰을 때 화면에 보이는 모든 요소는 뷰(view)라고 볼 수 있다. View를 담아 화면에 적절히 배치하기 위해 필요한 것이 뷰그룹(viewgroup)입니다.일반적으로 뷰 객체를 위젯, 뷰그룹 객체는 레이아웃이라고 합니다.
ViewGroup :
- ViewGroup은 n개의 View를 포함할 수 있는 Container이다.
- 우리가 자주 쓰는 레이아웃이 ViewGroup에 해당한다. ex) LinearLayout, ConstraintLayout ...
- 안드로이드에서 사용자가 눈으로 보는 모든 것은 View이다. 화면의 기본적인 컴포넌트라고 얘기 할 수 있다. TextView, ImageView, EditText, ... 등 자주 쓰는 모든 UI 관련된 컴포넌트는 View라는 클래스를 상속 받는다.
2. Fragment :
- Fragment는 간단하게 말하면 Activity + View라고 할 수 있다.
- View의 개념을 가지있어 독립적으로 존재할 수 없고 다른 Activity 종속되어 있다.
- 액티비티를 분할하여 화면의 한 부분을 정의한다. (작으면 부분, 크면 Activity 화면 전체를)
- Activity의 개념을 가지고 Fragment 위에 다른 View들을 배치할 수 있는 것이다.
- 다른 액티비티에서도 사용할 수 있어 재사용성이 뛰어나다.
- 액티비티와 같이 레이아웃, 생명주기를 따로 가진다.
Fragment가 나온 이유는 안드로이드가 여러 디바이스 (예 : 태블릿) 을 지원하면서 다양한 기기의 화면에 대응할 필요가 있어졌기 때문입니다. Fragment는 기본적으로 다양한 UI를 모듈화 시켜 (1) 재활용성을 높이고 (2) 화면 구성을 더욱 쉽게 할수 있도록 도와준다.
Fragment를 사용하는 이유(장점) :
- 기본적으로 Activity는 무겁다. (Activity를 새로 띄우는 것 보다는 Activity 위에 Fragment를 올리는 것이 훨씬 빨리 처리되고 system resource도 적게 먹으므로 Fragment를 띄우는 것이 좀 더 가볍다.
- Activity 내에서 Fragment는 상대적으로 가볍게 추가/제거가 가능하다.
- UI를 모듈화하여 재사용하고 화면 구성을 더욱 쉽게 할 수 있도록 도와준다.
- Activity Stack에 Activity를 쌓아두기보다 Fragment Backstack에서 Fragment를 관리하는게 메모리 관리에서의 효율도 챙기고 화면 전환시에 Activity보다 더 순조롭다.?????????
블로그들 마다 Activity가 무겁다는데 무슨 의미인지 잘 몰랐으나 System Resource를 많이 잡아 먹는 것을 무겁다고 표현한것 같다.)
Fragment는 Fragment class를 상속 받는데 Fragment에서 interface를 추가하는 것 말고는 따로 상속 받는건 없다.
public class CameraFragment extends Fragment{ ... 생략 ... }
public class Fragment implements ComponentCallbacks, OnCreateContextMenuListener, LifecycleOwner, ViewModelStoreOwner, HasDefaultViewModelProviderFactory, SavedStateRegistryOwner, ActivityResultCaller{ ... 생략 ... }
하지만 Activity는 무언가 엄청 상속 받는다. Activity에서도 4단계를 더 가야 Activity를 만났다.... 너무 길어서 나머지는 생략.
public class MainActivity extends AppCompatActivity { ... 생략 ... }
public class AppCompatActivity extends FragmentActivity implements AppCompatCallback, TaskStackBuilder.SupportParentable, ActionBarDrawerToggle.DelegateProvider { ... 생략 ... }
public class FragmentActivity extends ComponentActivity implements ActivityCompat.OnRequestPermissionsResultCallback, ActivityCompat.RequestPermissionsRequestCodeValidator { ... 생략 ... }
public class ComponentActivity extends androidx.core.app.ComponentActivity implements ContextAware, LifecycleOwner, ViewModelStoreOwner, HasDefaultViewModelProviderFactory, SavedStateRegistryOwner, OnBackPressedDispatcherOwner, ActivityResultRegistryOwner, ActivityResultCaller, OnConfigurationChangedProvider, OnTrimMemoryProvider, OnNewIntentProvider, OnMultiWindowModeChangedProvider, OnPictureInPictureModeChangedProvider, MenuHost { ... 생략 ... }
public class ComponentActivity extends Activity implements LifecycleOwner, KeyEventDispatcher.Component { ... 생략 ... }
Fragment의 단점:
- 복잡성: Fragment는 Activity 내에 존재하며, Activity와의 상호작용을 필요로 합니다. 이로 인해 앱의 구조가 복잡해질 수 있고, Fragment 간의 통신 및 데이터 공유를 관리하기 위해 추가적인 코드와 로직이 필요합니다.
- 생명주기 관리: Fragment는 Activity와 별도로 생명주기를 갖습니다. 이는 Fragment의 상태를 제어하기 위해 추가적인 관리가 필요하며, 생명주기 관리가 올바르게 이루어지지 않으면 메모리 누수(memory leaks)나 예기치 않은 동작이 발생할 수 있습니다.
- 화면 크기 및 다양한 디바이스 대응: Fragment는 다양한 화면 크기와 디바이스에 대응하기 위해 유연한 레이아웃을 구성할 수 있습니다. 그러나 Fragment의 레이아웃이 복잡하고 중첩된 경우, 다양한 디바이스에서 일관된 UI를 유지하기 어려울 수 있습니다
3. Fragment 와 Activity의 차이점?
- Activity는 독립적 활용 VS Fragment는 Activity에 종속.
- Activity는 전체화면을 차지 VS Fragment는 전체 화면 and 부분 (디자인에 많은 유연성 가짐)
- Activity는 자동적으로 스택에 넣어지고 Fragment는 트랜잭션을 통해서 요청해야 한다.
Activity 사용 예:
- 만드려는 앱의 크기가 작고,
- 기능이 복잡하지 않고 단순하고,
- 스마트폰 자체에서만 사용할 것이라면 Activity
Fragment 사용 예:
- 하나의 Activity 내에서 여러개의 화면을 구성하고 싶고,
- 태블릿 등의 큰 화면에서 공간 낭비 없는 UI를 구성하고 싶다면 Fragment
4. Activity 생명 주기
Activity LifeCycle에는 onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy(), onRestart()가 있다.
Activity LifeCycle
1) onCreate()
- 액티비티가 Launch되고 최초 실행될때 호출.
- 생명주기 통틀어서 단 한 번만 수행되는 메소드.
- 필요한 리소스들 초기화
2) onStart()
- Activity가 화면에 표시되기 직전에 호출됨
- 화면에 진입할 때마다 실행되어야 하는 작업을 이곳에 구현함
- BroadcastReceiver는 이 단계에서 등록을 하는것이 좋음. 왜냐하면 onStop 같은 곳에서 해제를 해주면 onCreate는 한번 불러오고 끝이니 onStart() 같은 곳에서 등록해주는 것이 좋다.
3) onResume()
- Activity가 화면에 보여지는 직후에 호출됨
- 사용자한테 화면에 보여지고 상호작용하는 메서드이다.
- RecyclerView나 ListView 새로 고침.
- 새로 작성된 내용을 서버에서 불러오려면 여기다 추가. (onCreate는 단 한번만 불러오기 때문에)
4) onPause()
- 사용자가 화면을 떠날 때 시스템이 첫 번째로 이 메서드를 호출한다.
- 현재 Activity가 사용자에게 포커스아웃 되어있는 상태
- 다른 Activity가 호출되기 전에 실행되기 때문에 무거운 작업을 수행하지 않도록 주의해야함
- 일시 정지할 때 필요 없는 리소스 해체하거나 Data는 이곳에 저장 (간단한 데이터 - SharedPreference사용해서)
- 예: 카메라 미리보기, 배터리 수명에 영향을 미칠 숫 있는 모든 리소스를 해제
5) onStop()
- Activity가 다른 Activity에 의해 100% 가려질 때 호출되는 메소드
- 이 상태에서 Activity가 호출되면, onRestart() 메소드가 호출됨
- 이 메서드에서는 앱이 사용자에게 보이지 않는 동안 앱이 필요하지 않는 리소스를 해제하거나 조정해야 한다
- 정보를 데이터베이스에 저장할 적절한 시기를 찾지 못했다면 onStop() 상태일 때 저장
- 예를 들어 애니메이션을 해제하거나 데이터베이스 저장 작업을 하면 된다.
6) onDestroy()
- Activity가 소멸되기 직전에 호출됨
- Activity가 종료되는 경우
- 사용자: finish(), onBackPressed()
- 시스템: 메모리부족(프로세스 종료)
- onStop(), onDestroy() 메소드는 메모리 부족이 발생하면 스킵될 수 있음
7) onRestart()
- onStop()이 호출된 이후에 다시 기존 Activity로 돌아오는 경우에 호출되는 메소드
- onRestart()가 호출된 이후 이어서 onStart()가 호출됨
5. Fragment 생명 주기
1. onAttach() : Activity에 Fragment가 추가 되는 부분
2. onCreate() :
- Fragment 만 CREATED 가 된 상황입니다.
- 이 시점에는 아직 Fragment View 가 생성되지 않았기 때문에 Fragment 의 View 와 관련된 작업을 두기에 적절하지 않습니다.
3. onCreateView() :
- 레이아웃 inflate 담당
- savedInstanceState로 이전 상태에 대한 데이터 제공
- View와 관련된 객체를 초기화 할 수 있음
4. onViewCreated() :
- onCreateView()를 통해 반환된 View 객체는 onViewCreated()의 파라미터로 전달 된다.
- 이 때 Lifecycle이 INITIALIZED 상태로 업데이트가 됨
- 때문에 View의 초기값 설정, LiveData 옵저빙, RecyclerView, ViewPager2에 사용될 Adapter 세팅은 이 메소드에서 해주는 것이 적절함
5. onViewStateRestored() :
- 저장해둔 모든 state 값이 Fragment의 View의 계층 구조에 복원되었을 때 호출 ex) 체크박스 위젯이 현재 체크되어있는가
6. onStart() :
- 사용자에게 보여질 수 있을 때 호출
- Activity의 onStart() 시점과 유사
7. onResume() :
- 프래그먼트와 사용자가 상호작용 하는 부분
8. onPause() :
- Focusing이 완전히 떠나기 전에 불러지는 함수
- 잠깐만 불러오기 때문에 긴 작업 x
9. onStop() :
- Fragment가 더 이상 화면에 보여지지 않게 되면 onStop() 콜백 호출
- 부모 액티비티, 프래그먼트가 중단될 때, 상태가 저장될 때 호출
- API 28버전을 기점으로 onSaveInstanceState() 함수와 onStop() 함수 호출 순서가 달라짐, 따라서 onStop()이 FragmentTransaction을 안전하게 수행하는 마지막 지점이 됨
10. onDestroyView() :
- 모든 exit animation, transaction이 완료되고 Fragment가 화면으로부터 벗어났을 경우 호출.
- Fragment와 관련된 View에 할당된 리소스를 해제할 수 있습니다. 예를 들어, Bitmap, MediaPlayer 등의 리소스를 해제하거나, 리스너 등의 등록을 해제할 수 있습니다.
- Fragment의 View가 제거되는 시점이므로, View와 관련된 작업을 중단해야 합니다. 예를 들어, 애니메이션, 타이머 등의 작업을 적절히 중단하고 해제해야 합니다.
- 가비지 컬렉터에 의해 수거될 수 있도록 Fragment View에 대한 모든 참조가 제거되어야 함
11. onDestroy() :
- Fragment가 제거되거나, FragmentManager가 destroy 됐을 경우, onDestroy() 콜백 함수가 호출
- Fragment Lifecycle의 끝을 알림
onDestroyView()가 호출되면 프래그먼트 객체 자체는 사라지지 않고 메모리에 남아있다. 반면 onDestroy()가 호출되면 프래그먼트 객체가 파괴된다.
12. onDetach() :
- 프래그먼트가 액티비티로부터 해제되어질 때 호출된다.
'안드로이드 학습 > Android 기술면접 대비' 카테고리의 다른 글
안드로이드 Context (0) 2023.06.16 Jetpack - AAC (0) 2023.06.13 ANR이란 (0) 2023.06.12 Android Service (0) 2023.06.12 Android 런타임 ART 및 Dalvik (0) 2023.06.05