[Android]
Activity와 Fragment
* 목표 : Activity와 Fragment의 차이에 대해 알아보자.
근본적으로 '안드로이드'란 무엇이냐?
"Android는 Linux 커널을 기반으로 Google에서 개발 한 모바일 운영 체제이며 주로 스마트 폰 및 태블릿과 같은 터치 스크린 모바일 장치 용으로 설계되었습니다. Android의 사용자 인터페이스는 주로 실제 동작에 느슨하게 대응하는 터치 제스처를 사용하는 직접 조작을 기반으로 합니다. 스와이프, 탭, 핀치 등의 텍스트 입력을 위한 가상 키보드와 함께 화면의 개체를 조작할 수 있습니다. " -구글
대부분 아시다시피 안드로이드는 '애플리케이션'을 사용하여 기능을 이용한다.
그리고 Activity와 Fragment는 이 애플리케이션을 만들 때 사용되는 녀석들이다.
- Activity is the part where the user will interacts with your application. In other words, it is responsible for creating a window to hold your UI components. (UI components and how to build a layout will be discussed in another article).
Activity는 사용자가 애플리케이션과 상호 작용하는 부분이다. UI 구성요소를 보관할 창을 만드는 역할이다. - Fragment represents a behavior or a portion of user interface in an Activity. You can combine multiple fragments in a single activity to build a multi-pane UI and reuse a fragment in multiple activities. You can think of a fragment as a modular section of an activity, which has its own lifecycle, receives its own input events, and to which you can add or remove while the activity is running (sort of like a "sub activity" that you can reuse in different activities). And it must always be embedded in an activity. The fragment's lifecycle is directly affected by the host activity's lifecycle - in other words, a fragment cannot be instantiated alone!
Fragment는 Activity에서 동작 또는 사용자 인터페이스의 일부를 나타낸다. 단일 Activity에서 여러 Fragment를 결합하여 다중 창 UI를 빌드하고 여러 활동에서 Fragment를 재사용 할 수 있다. Fragment는 자체 생명주기를 갖고 있고 자체 입력 이벤트를 수신하며 Activity가 실행되는 동안 추가, 제거할 수 있는 Activity의 모듈러 섹션이라고 생각할 수 있다. (마치 다른 Activity에서 재사용할 수 있는 서브 Activity와 같다.) 그리고 Fragment는 항상 Activity에 포함되어 있어야 한다. Fragment의 생명주기는 호스트 Activity의 생명주기에 직접적인 영향을 받는다. 즉, Fragment는 단독으로 인스턴스화 될 수 없다.
애플리케이션이 열리고 첫 번째 Activity가 표시되면 특정 라이프 사이클을 따른다. 여기에서 Activity가 파괴(onDestory()), 일시 중지(onPause()), 재개(onResume()) 또는 생성(onCreate())되는시기를 처리할 수 있다. Fragment 생명주기는 Activity의 생명주기 내에 포함되지만 몇 가지 세부 정보와 추가 단계가 있다.
The only mandatory callback that we should override is onCreate for the activity and onCreateView for fragment, because we define the layout and do the mapping of the UI components inside of them.
(우리가 재정의해야하는 유일한 필수 콜백은 Activity에 대해서는 onCreate, Fragment에 대해서는 onCreateView이다. 레이아웃을 정의하고 내부에 있는 UI 구성 요소의 매핑을 수행하기 때문이다.)
- onCreate(activities) / onCreateView(fragments): The only required method (that is, it needs to be overwritten by the class that extends Activity) defines what the layout of that activity is (with the "setContentView" method) and where the XML components are mapped to the code.
- 유일한 필수 메소드는 (Acitivity를 확장하는 클래스로 덮어써야 함) 해당 Acitivity의 레이아웃과 XML위치를 정의한다. - onStart: This method is always executed right after the onCreate and whenever the activity returns from background to foreground through onRestart.
- 이 메소드는 항상 onCreate 직후와 onRestart를 통해 활동이 background에서 foreground로 돌아올 때마다 실행된다. - onResume: It always runs before the application appears to the user. At that moment this activity is already at the top of the activity stack and is visible to the user.
- 항상 애플리케이션이 사용자에게 표시되기 전에 실행된다. onResume 될 때 Activity가 이미 액티비티 스택의 맨 위에 있으면 사용자에게 표시된다. - onPause: Called when the system is about to start resuming another activity. This method is generally used to confirm unsaved data changes, stop animations among other things that may be consuming CPU, and so on.
- 시스템이 다른 Activity를 재개하려고 할 때 호출된다. 일반적으로 저장되지 않은 데이터 변경 사항을 확인하고 애니메이션 같이 CPU 먹는 것들을 멈춘다. - onRestart: Called when an activity that was stopped in the background is returning to the foreground because the activity that was visible above it is being destroyed or called. It always runs when an activity is in the STOP state.
- 백그라운드에서 중지 된 Activity의 상위 Activity가 소멸되거나 호출되어 foreground로 돌아갈 때 호출된다. Activity가 항상 STOP 상태 일 때 실행된다. - onStop: Called when the activity is no longer visible to the user. This can happen because it is being destroyed or is going to background so that another activity takes its place at the top of the stack and is visible to the user.
- Activity가 더 이상 사용자에게 표시되지 않을 때 호출된다. - onDestroy: Called before destroying the activity. This is the last call that activity will take when it is leaving the activity stack - that is, it is being destroyed - it is called because the activity is terminating (someone called finish ()), or because the system is temporarily destroying this activity instance to save space.
- Activiy를 파괴하기 전에 호출된다.
이상이 교과서적인 설명이고 내가 실제 사용해보고 이해한 내용은 다음과 같다.
Activity는 하나의 화면이다. 앱의 모든 화면을 Activity로만 구성할 수 있다. 그러나 크고 무겁다. 따라서 리소스 관리, 메모리 관리 측면에서 부담이 된다. 그래서 사용하는 것이 Fragment이다. Activity와 비슷한 생명주기를 갖지만 엄연히 다르다. Fragment는 하나의 View 껍데기이다. 고객이라는 기능을 구현할 때 고객관리라는 Activity를 만들고 그 안에 고객 검색, 고객 등록, 고객 삭제 등의 세부화면은 Fragment로 구성할 수 있는 것이다.
Acitivity와 Fragment의 차이는 생명주기 말고도 Context라는 측면에서의 차이도 있다. Context는 쉽게 말해 참조할 객체를 말하는데, 예를 들어 getResources() 라는 메서드를 통해 Res폴더 안의 String 값이나 Image를 불러오려고 한다고 가정해보자. Activity 내에서는 단순하게 getResources(). getDrawable(R.drawable.icon_1024_001)라는 이름으로 해당 이미지 객체를 갖고 올 수 있다.
그러나 Fragment에서는 getResources()만 사용하면 NulPointerException 에러가 뜬다.
@Override
public Resources getResources() {
if (mResources == null && VectorEnabledTintResources.shouldBeUsed()) {
mResources = new VectorEnabledTintResources(this, super.getResources());
}
return mResources == null ? super.getResources() : mResources;
}
getResources() 메소드 자체는 AppCompatActivity라는 클래스를 상속받고 있기 때문이다.
따라서 Fragment에서는 getContext().getResources() 혹은 getActivity(). getResources()의 방식으로 호출하여야 한다.
Fragment는 Activity가 아니기 때문에 Context를 갖지 않는다.
안드로이드 내에서 알림메세지를 띄우는 Toast 같은 클래스에서는 Context를 필수로 입력하여야 하는데, Activity에서 토스트를 사용하면 Toast.makeText(this, "message", Toast.LENGTH_SHORT). show(); 등으로 이용해도 되지만 Fragment에서는 this 대신 getContext()를 이용해야 한다.
안드로이드를 이제 접하는 초보들은 구글링을 통해 얻은 샘플 코드가 Activity에서 바로 사용 할 수 있는지, Fragment에서는 어떤 방식으로 콜 해야 하는지 시행착오를 겪을 것이다. 내가 호출하려는 함수가 Activity안에서 사용해야 하는지, Fragment내에서도 사용가능한지 알기 위해서는 약간의 공부가 필요한 시점이다. Context에 대해서는 다음에 다시 한번 상세하게 다뤄보도록 하자.
<참고자료>
'Andorid' 카테고리의 다른 글
[Android / Java] Camera Pad 만들기 (1) | 2020.12.17 |
---|---|
[Android] Layout / View Group의 종류 2. Frame Layout (1) | 2020.12.11 |
[Android / Java] Camera 촬영 및 내부/외부 저장소에 저장 (8) | 2020.12.06 |
[Android / Java] 권한설정 (1) | 2020.12.06 |
[Android] Layout / View Group의 종류 1. Linear Layout (1) | 2020.12.02 |