내일배움캠프 21일차

김재현·2024년 3월 26일
post-thumbnail

오늘은 스탠다드반 과제 리뷰와 Acitivity 생명주기를 공부해보았다.

과제 리뷰

1. scaletype

  • 과제 제출시 사용했지만 의미를 정확히 몰라서 다시 찾아보았다.

scaletype은 ImageView에 해당하는 속성으로 8가지 옵션으로 나눌 수 있다.

1. android:scaleType="center"
: 이미지 원본 크기와 비율을 유지하며 이미지의 중앙을 layout_width, layout_height 안에 출력한다. (원본 이미지를 그대로 올리는 방법)

(원본 크기를 그대로 가져오기 때문에 layout보다 이미지가 크면 출력되지 않는다.)
/
2. android:scaleType="centerCrop"
: ImageView의 layout에 가로/세로의 길이 중 짧은 쪽을 ImageView의 layout에 꽉 차게 크기를 맞춰 출력한다. (이미지가 뭉개지더라도 규격에 맞춰준다.)

(ImageView의 layout이 가로가 더 짧기에 가로에 맞춰 세로가 출력되지 않은 모습.)
/
3. android:scaleType:"centerInside"
: 이미지의 가로/세로 길이 중 긴 쪽을 ImageView의 layout에 맞춰 출력하는데 원본 이미지의 가로/세로 비율은 유지되고 layout에 이미지외 빈공간은 background 속성의 color로 채워짐.
fitCenter와 다른점은 원본 이미지가 ImageView의 layout보다 작다면 이미지의 크기는 유지된다.

(이미지 크기는 유지되고 ImageView의 background가 black이라 나타나는 모습이다.)
/
4. android:scaleType:"fitCenter"
: 이미지의 가로/세로의 길이 중 긴 쪽을 ImageView의 layout에 맞춰서 출력한다. 원본 이미지의 가로/세로 비율은 유지되고 이미지의 크기가 ImageView의 레이아웃 크기에 따라 변한다.
(centerInside와 비슷하지만 ImageView의 레이아웃 크기에 따라 이미지 크기가 다르다.)

(centerInside와 다르게 로고의 크기가 커진 모습!)
/
5. android:scaleType:"fitStart"
: ImageView layout 안에서 이미지의 가로/세로 비율을 유지하며 출력하고, layout의 왼쪽 상단 기준으로 정렬한다.

(비율은 동일하고 크기는 커졌지만 좌상단에 위치해있다.)
/
6. android:scaleType:"fitEnd"
: ImageView layout 안에서 이미지의 가로/세로 비율을 유지하며 출력하고, layout의 오른쪽 하단 기준으로 정렬한다.

(fitStart와는 반대로 우하단에 위치해있다.)
/
7. android:scaleType:"fitXY"
: 가로/세로 비율에 상관없이 ImageView의 layout에 꽉 차게 출력된다.

(이번 프로젝트때 사용해서 전면 ImageView를 구성하였다.)
/
8. android:scaleType"matrix"
: 이미지의 원본의 크기와 비율을 유지하며 이미지 원본대로 왼쪽 상단을 기준으로 출력된다.
(이미지가 ImageView의 layout보다 크면 이미지는 출력되지 않는다.)

(이미지의 원래 크기가 50x50이라 이렇게 출력이 되지만)

(layout보다 큰 이미지로 설정하면 출력되지 않는 모습.)
.
.
.
출처:[https://velog.io/@oyunseong/Android-ImageView-scaleType-%EC%86%8D%EC%84%B1]

2. DP와 SP의 차이

  • 예전 강의를 들을때 TextView는 sp로 설정하라고 하셔서 아무 생각없이 설정해놨는데 튜터님께서

    다른 점을 알고있냐고 하셔서 한번 검색해서 다른 점을 알아보았다!

DP (Density-Independent Pixels)

  • UI 레이아웃을 정의할 때 레이아웃 치수나 위치를 지정하기 위해 사용하는 단위로 픽셀 독립 단위이며 화면의 크기가 달라도 동일한 비율로 보여주기 위해 사용하기 때문에 큰 화면과 작은 화면에 상관없이 같은 크기로 나타난다.

SP (Scale-Independent Pixels)

  • UI 레이아웃을 정의할 때 텍스트의 크기를 지정하기 위해 사용하는 단위로 예를 들어 안드로이드 설정 화면에서 텍스트 크기를 따로 설정하게 되면 해당 설정의 영향을 받아 TextView의 텍스트 크기가 커진다. DP로 TextView의 textSize를 설정하면 시스템 설정에 상관없이 일정한 크기를 유지한다.

따라서! 이번 UI 구성에서는 sp보다는 DP가 더 알맞은 선택이었던것 같다. 아무래도 UI 화면에서는 텍스트 설정에 따라 바뀌기 보단 일관성 있는 화면의 텍스트 크기를 표현하는 것이 맞았던 것 같다.
.
.
.
출처:[https://woovictory.github.io/2019/01/03/Android-Diff-of-DP-SP/]

3. layout 위에 layout으로 정렬(?)

  • 원래 모양을 레이아웃 3개로 나눠보았다.

  • LinearLayout으로 만들면 좋을 것 같았는데 ConstraintLayout에 적응할겸 TextView와

    EditText는 다른 layout에 넣어주었고

  • Button과 TextView 하나는 그대로

  • 마지막으로 ImageView들은 따로 묶어서 layout에 넣어주었다!

4. minheight 공부

  • 과제중 다음과 같은 권고사항이 떴다.

    이게 뭔가...하고 alt+Enter로 처리했는데

    다음과 같이 minHeight가 생겨버렸는데 그냥 넘어갔었다...

    그래서 한번 검색을 해봤는데

  • android:minWidth = 최소 가로 크기를 설정
  • android:maxWidth = 최대 가로 크기를 설정
  • android:minHeight = 최소 세로 크기를 설정
  • android:maxHeight = 최대 세로 크기를 설정
  • TextSize가 20dp이므로 minWidth가 100dp, maxWidth가 200dp일때 100dp로 설정된 EditText는 200dp가 넘어가면 다음 줄로 넘어가고 이렇게 EditText의 크기를 이렇게 조정할 수도 있다는걸 알게되었다.
  • 사실 권고사항은 구글에서 권장하는 사용자 터치 영역 크기가 width=48, height=48이라서

    났던 것이었다! 그래도 덕분에 새로운걸 알게되었다.

    (height 값만 바꿔줘도 권고사항은 사라진다!)

과제는 다시 한번 마무리 해보았고 갈길도 멀었지만 좀 더 신경쓰면서 꼼꼼히 해야겠다고 다짐했다!

Activity 생명 주기(최대한 이해한 내용으로)

  • 사용자가 앱을 나가고 돌아오는 과정에서 앱의 Activity 인스턴스는 수명 주기 안에서 서로 다른 상태를 통해 전환된다. Acitivity 클래스는 상태가 변경되거나 시스템의 상태가 변경될 때 이를 활동에 알리는 여러 콜백을 제공합니다.

  • 활동 수명 주기의 단계 간 전환을 탐색하기 위해 Activity 클래스는 6가지 콜백(onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy())으로 활동이 새 상태로 전환될 때 시스템은 이러한 각 콜백을 호출합니다.

    출처:[https://developer.android.com/guide/components/activities/activity-lifecycle?hl=ko]

onCreat()

  • 이 콜백은 시스템이 먼저 활동을 생성할 때 실행되는 것으로 필수적으로 구현해야 합니다.

    onCreate() 메서드에서 활동의 전체 수명 주기 동안 한 번만 발생한다.

    onCreate() 메서드가 실행을 완료하면 started 상태가 되고 시스템은 onStart() 및

    onResume() 메서드를 연속으로 호출한다.

onStart()

  • 활동이 시작됨 상태로 전환되면 시스템은 onStart()를 호출하고 이 호출을 통해 앱에서 활동이

    포그라운드로 전환되어 상호작용할 수 있도록 준비할 때 사용자에게 활동이 표시된다.
    (포그라운드(현재 사용자라고도 함), 백그라운드(다른 사용자가 활성 상태인 경우))
    포그라운드:[https://source.android.com/docs/devices/automotive/users_accounts/user_system?hl=ko]

    onStart() 메서드는 빠르게 완료되며 onCreat() 상태와 마찬가지로 활동은 유지되지 않는다.

    이 콜백이 완료되면 활동이 재개됨 상태로 전환되고 시스템에서 onResume() 메서드를 호출한다.

onResume()

  • 활동이 재개됨 상태로 전환되면 포그라운드로 이동하고 시스템에서 onResume() 콜백을 호출합니다.

    이 상태에 들어갔을 때 앱이 사용자와 상호작용 합니다. 앱에서 포커스를 읽을 때까지 이 상태를

    유지합니다.

    활동이 일시중지 상태에서 재개됨 상태로 돌아오면 시스템은 onResume() 메서드를 다시 한번

    호출하고 활동이 재개됨 상태로 전환될 때마다 발생해야 하는 다른 초기화를 실행한다.

    방해가 되는 이벤트가 발생하면 활동은 일시중지 상태가 되고 시스템은 onPause() 콜백을 호출한다.

onPause()

  • 시스템은 사용자가 활동을 떠난다는 첫 번째 신호로 이 메서드를 호출하지만 항상 이 활동이

    소멸된다는 의미는 아니다. 활동이 포그라운드에 있지 않음을 나타내지만 사용자가 멀티 윈도우

    모드에 있는 경우에는 계속 표시된다.

    onPause() 메서드를 사용하여 Activity가 일시중지 상태에 있고 곧 재개될 것으로 예상되는

    작업을 계속할 수 없거나 적절하게 진행될 수 있는 작업을 일시중지하거나 조정합니다.

    활동이 일시중지됨 상태에서 onResume()를 호출할 때 메모리에 유지해둔 Activity 인스턴스를

    다시 호출합니다. 만약 활동이 완전히 보이지 않게 되면 시스템은 onStop()를 호출합니다.

onStop()

  • 활동이 사용자에게 더 이상 표시되지 않으면 중지됨 상태로 전환되고 시스템에서 onStop()

    콜백을 호출합니다. 새로 시작된 활동이 전체 화면을 차지할 때 발생할 수 있으며 시스템은

    활동 실행이 완료되고 종료되려고 할 때 onStop()를 호출합니다.

    onStop() 메서드에서 앱이 사용자에게 표시되지 않는 동안 필요하지 않은 리소스를 해제하거나

    조정합니다. onStop()를 사용하면 멀티 윈도우 모드에서도 UI 관련 작업이 계속되며

    CPU를 비교적으로 많이 사용하는 종료 작업을 실행할 수 있습니다.

    활동은 정지됨 상태에서 다시 시작되어 사용자와 상호작용을 하거나 실행을 종료하고

    사라집니다. 활동을 다시 시작하면 onRestart()를 호출하고 실행을 종료하면 onDestroy()를

    호출합니다.

onDestroy()

  • onDestroy() 는 활동이 소멸되기 전에 호출됩니다. 활동이 완료되는 경우에 onDestroy() 는

    활동이 수신하는 최종 수명 주기 콜백으로 구성 변경의 결과로 onDestroy() 가 호출되면

    시스템은 즉시 새 활동 인스턴스를 만든 다음 onCreate() 를 호출합니다.

    onDestroy() 콜백은 onStop() 와 같이 이전 콜백에서 해제되지 않은 모든 리소스를 해제한다.
    .
    .
    .
    .
    .
    아직 이해가 막 되진 않는데 계속 한번 들여다 봐야할 것 같다.

하루의 마무리

  • 오늘은 피드백 받은 내용 수정하고 Activity 생명 주기를 한번 공부해봤는데

    생각보다 생명 주기가 너무 어렵다 ㅠㅠ 공식 문서라 그런가 굉장히 내용이 딱딱하다...

    블로그도 참고 해가면서 4대 컴포넌트 이해하고 넘어가야 좋을 것 같다!

    안드로이드 4대 컴포넌트

  • 액티비티(Activity)
  • 서비스(Service)
  • 방송수신자(Broadcast Receiver)
  • 콘테트 제공자(Content Provider)

0개의 댓글