Activity & Fragment

장범준·2023년 4월 30일
0

※지극히 저의 언어로 해석해서 이해한 내용입니다.※

먼저 Activity와 Fragment를 이해하기위해 예시를 들자면,
Activity 건물이고, Fragment는 Activity에 종속되있는 입니다.

Activity가 건물인 이유

우리는 보통 건물을 지을 때 특정한 의도를 가지고 짓습니다. 집, 사옥, 카페 등 특정한 기능을 가진 건물들이고, 건물 하나당 하나의 큰 기능을 가집니다(여러 기능을 가질 수는 있음). 더불어 사람들은 건물과 상호작용하며, 건물은 사용자에게 여러 활동을 할 수 있는 선택지를 줍니다. 마지막으로 이런 건물들이 여러개 모여 하나의 마을을 만듭니다.

우리는 Activity는 하나의 화면이라는 사실을 압니다. 그리고 앞에 예시를 적용해보면 이러 합니다. Activity(이하 화면)는 보통 하나당 하나의 기능을 가지고, 화면은 사용자와 상호작용을 위해 선택지를 줍니다(UI를 말하며, 버튼, 글상자 같은게 있음). 마지막으로 이런 화면들이 모여 하나의 앱을 만듭니다.

Activity 사용법

setContentView

하나의 화면은 Java, kotlin으로 구성로 클래스(비즈니스 코드, 실질적 연산부?)와 .xml파일(ㄹㅇ 화면)이 있습니다. 이 둘은 본래 다른 파일입니다. 하지만 이 둘을 이어주는 것이 있습니다.

setContentView(R.layout. xml파일)

이 코드를 클래스 파일에 추가해주면, 둘은 이어지게 됩니다.

manifest

또한 manifest에 활동 및 관련된 특정 속성을 선언해야 앱에서 Activity를 사용할 수 있습니다. manifest 파일을 열고 activity를 application의 하위 요소로 추가해야 합니다.

    <manifest ~~~ >
      <application ~~~ >
          <activity android:name="클래스이름" />
          ...
      </application ~~~ >
      ...
    </manifest >
    

Activity에 생명주기 ※중요※

생명주기는 대칭으로 이해하면 이해하기 쉽습니다.

OnCreate

액티비티가 실행될 때 한 번만 실행됩니다(static?).실행되면 view를 생성합니다.

OnDestroy

View를 폐기하고, 액티비티를 실행하면서 사용한 리소스를 해제합니다. (앱 종료)

OnStart

주로 통신하거나 센서 처리가 필요할 때 사용됩니다.

OnStop

다른 액티비티가 현재 화면 전체를 가리거나(유튜브를 보다가 카톡알림이 와 넘어간 경우), 액티비티가 중지(버튼을 눌러 다음화면으로 넘어간 경우)될 때 호출됩니다. 이때 통신이나 센서 정지가 이루어 집니다.

OnRestart

OnStop에서 사용자가 다른 액티비티를 호출하고 다시 돌아오는 경우(카톡 다했으면 보던거 마져 봐야겠죠?) OnRestart가 호출됩니다.

OnResume

사용자에게 화면이 보이는 단계입니다. 사용자가 다른 앱을 실행하거나 앱 종료, 화면이 꺼지기 등 방해 요소가 있기 전까지는 OnResume상태에 머무릅니다.

OnPause

OnResume단계에서 방해 요소가 발생하면 OnPause단계로 넘어갑니다.

Fragment가 방인 이유

일단 fragment는 독립적으로 있을 수 없습니다. Activity에 종속되거나, 다른 Fragment에 종속되어있어야 합니다. 하지만 사이즈 제한이 딱히 있진 않습니다. 더불어 하나에 Activity에 여러 Fragment를 추가할 수 있습니다.

Fragment는 방입니다. Fragment는 Activity보다 가볍습니다. 그렇기에 하나에 기능 수행을 위해 무거운 건물을 생성하기 보다는, 가벼운 Fragment를 생성하여 기능을 수행하게 되죠(ex. 카톡에서 이모티콘 사용을 위해 화면을 전환하지 않고, 밑에 조그만한 창?을 보여주죠)

Activity 사용법

크게 두가지 방법이 있는데,

하나는 프래그먼트를 액티비티의 레이아웃 파일 안에서 선언하는 것입니다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <fragment android:name="Fragment파일 이름"
            android:id="@+id/list"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
    <fragment android:name="Fragment파일 이름"
            android:id="@+id/viewer"
            android:layout_weight="2"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
</LinearLayout>

진짜 말그대로 레이아웃파일에 추가하는 것입니다!(푸하핫)

두번째는 프래그먼트를 기존의 ViewGroup에 추가합니다

val fragmentManager = supportFragmentManager
val fragmentTransaction = fragmentManager.beginTransaction()

val fragment = Fragment이름()
fragmentTransaction.add(R.id.fragment_container, fragment)
fragmentTransaction.commit()

액티비티 내에서 프래그먼트 트랜잭션(추가,삭제,수정)을 수행하려면,FragmentTransaction에서 가져온 API를 사용해야 합니다.
그렇기에 위에 두줄은 view그룹을 만드느 과정이고, 밑에 세줄은 원하는 Fragment를 view그룹추가하는 과정입니다.

add()에 전달되는 첫 인수가 ViewGroup이고 여기에 프래그먼트는 리소스 ID(R.id가 리소스파일에 있는 아이디를 참조한다느 의미)가 지정한 대로 배치되어야 합니다. 두 번째 매개변수는 추가할 프래그먼트입니다. 더불어 변경하고 나면, 반드시 commit()을 호출해야 변경 내용이 적용됩니다.

Fragment를 사용하는 이유


공부를 하며 든 궁금증인데, 왜 Fragment를 사용하는지 모르겠었습니다. Fragment를 공부하고, 복잡한 생명주기를 이해하는것은 귀찮은 일이 아닐 수 없었습니다. 그래서 찾아보니 Fragment에 장점이 많았습니다.

가볍다!

Activity는 Fragment에 비해 무겁습니다(자원측면,전환측면).그렇개에 추가/삭제도 쉽고, 메모리 효율도 좋은 Fragment를 사용하면 좋습니다!

재사용성이 좋다!

화면이나 하는 일(비즈니스 로직)을 fragment단위로 나눌 수 있고, 관심사 분리를 통해 의존성(일을 하기위해 여기있는 자원이 필요한 성질)을 분리하여, 다른 화면에서 다시 사용할 수 있습니다.

꾸미기 쉽다!

Fragment는 기본적으로 큰 화면에서 역동적이고 유연한 화면 디자인을 지원하는 것이 목적이었습니다. 그래서 보다 유연한 UI/UX 구현이 가능합니다.

맺으말

1년간 많은것을 배웠는데 기록을 안하니 까목는것 같아, 오늘부터 틈틈이 글을 쓰기로 했습니다. 아직 글쓰기 실려이 부족하여 저가 이해한것을 남들에게 알리는게 부족합니다. 그래서 출처도 함께 남기니 꼭 일어 봐주세용. 더불어 Fragment또한 생명주기가 있는데, 길어서 여기에 적기 보다는 궁금한 사람이 찾아보는게 나을것 같다. 이것 또한 한번쯤은 꼭보길 권장합니다.
마지막으로 저는 벡엔드,안드로이드,임베디드,백준(프로그래머스) 관련 포스팅을 많이 남길 것 같습니다. 1년간 배운것들 위주로 남기며, 틈틈이 그날 배운것들도 쓸테니 많은관심 부탁드립니다!

Activity

https://developer.android.com/guide/components/activities/intro-activities?hl=ko

Fragment

https://developer.android.com/guide/components/fragments?hl=ko

Fragment를 사용하는 이유

https://velog.io/@jaeyunn_15/Android-%EB%82%B4%EA%B0%80-Fragment%EB%A5%BC-%EC%9E%90%EC%A3%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0

profile
자신의 언어로 해석해, 자신의 것으로 만둘자.

0개의 댓글

관련 채용 정보