ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 :
    • 안드로이드에서 사용자가 눈으로 보는 모든 것은 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의 차이점?

    1. Activity는 독립 활용 VS Fragment는 Activity에 종속.
    2. Activity 전체화면을 차지 VS Fragment는 전체 화면 and 부분 (디자인에 많은 유연성 가짐)
    3. 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
Designed by Tistory.