📜 TIL

[Android] 안드로이드 개발자 면접질문 정리 part 1

둥굴둥굴둥굴레차 2023. 2. 22. 11:58

Android 4대 컴포넌트

❗️ 컴포넌트: 앱의 구성 단위

 

Activity

  • UI화면을 담당하는 컴포넌트
  • 안드로이드에서 화면을 관리하고 사용자의 다양한 이벤트를 처리하는데 사용

Service

서비스에는 크게 3가지로 나뉘는데 포그라운드, 백그라운드, 바운드로 나뉜다.

 

포그라운드 서비스

-알림을 표시해 놓고 사용자와 상호 작용하지 않아도 계속 실행되는 걸 말함

 

백그라운드 서비스

-사용자가 직접 알지 못하는 작업을 수행할 때 사용

 

바운드 서비스

-앱 내에서 서비스를 사용하여 간단한 클라이언트 - 서버 환경을 구성하는 것을 말함(특정 컴포넌트와 서비스간 상호작용)

 

startService

⇒ 단순 서비스를 시작, 종료하게 하는 서비스이다.

 

생명주기는 onCreate - onStartCommand - onDestroy

 

onStartCommand return result

  • START_STICKY : 안드로이드가 서비스를 강제 정지한 경우, null intent를 보내서 재시작한다.
  • START_NOT_STICKY : 안드로이드가 서비스를 강제 정지한 경우, 재시작 하지 않는다.
  • START_REDELIVER_INTENT : 안드로이드가 서비스를 강제 정지한 경우, 동일한 intent를 보내서 재시작한다.

 

bindService

⇒ 특정 컴포넌트와 서비스간 상호작용이 있을 때 사용하는 서비스이다.

생명주기는 onCreate - onBind - onUnbind - onDestroy

 

intentService

⇒ 액티비티와 프래그먼트 LifeCycle에 의존하지 않고 백그라운드에서 처리하고 싶은 경우 사용한다. 이 서비스는 핸들스레드루퍼 + 핸들러를 조합해 구현되어 있다. 콜백메소드를 구현할 필요 없고 onHandleIntent()만 구현하면 되고 요청한 작업이 완료되면 자동적으로 서비스를 중단한다.

 

Broadcast Receiver

예를들어 화면이 on, off 되었을 때 / 재부팅 할 때 등이 있다.

Broadcast Receiver에는 정적, 동적 리시버로 나뉜다.

 

정적 리시버

-매니페스트에 등록하여 리시버를 구현하는 형태인데 한 번 등록하면 해제할 수 없는 방식이다.

 

동적 리시버

-클래스 파일에서 리시버를 등록, 해제할 수 있는 형태이기 때문에 앱에 부하를 줄 일 수 있다. 하지만 해제를 적절히 해주지 않는다면 메모리 릭이 발생할 수 있다.

(❌ 리시버에는 너무 많은 작업, 시간이 오래걸리는 작업을 하면 안된다. 처리 지연시간이 길어진 경우 ANR이 발생하기 떄문에 리시버에는 간단한 일을 처리하도록 하고, 스레드를 별도로 생성해서 처리하도록 해야한다)

 

Content Provider

다른 앱의 데이터를 사용하고자 하는 앱에서는 URI를 이용하여 콘텐츠 리졸버를 통해 다른 앱의 콘텐츠 프로바이더에게 데이터를 요청한다. 요청 받은 컨텐츠 프로바이더는 URI를 확인하고 내부에서 데이터를 꺼내어 컨텐츠 리졸버에게 전달한다.

❗️ 안드로이드 권장 URI 형식

Content://Authority/path/id

content : 스키마

authority : 콘텐츠 프로아비더의 명칭

path : 정보의 위치(사용자 정의영역)

id : 특정 정보를 지칭(사용자 정의영역)

❗️ 스키마 : 제약조건에 관해 전반적인 명세를 기술한 것(어떤 구조로 데이터가 저장되는가를 나타내는 구조)

❗️ URL과 URI 의 차이는 URL은 웹상에서 서비스를 제공하는 각 서버들에 있는 파일들의 위치를 표시하는 것, URI는 존재하는 자원을 식별하기 위한 것

 


Activity lifecycle

Activity가 시작하는 순간부터 종료되는 순간까지의 주기

onCreate()

  • 필수적으로 구현해야하는 주기
  • Activity가 생성되면 가장 먼저 호출되는 callback함수
  • 단 한번만 발생하는 주기. 즉, 단 한번만 시행하면 되는 일들을 여기서 실행
    • 화면 그리기, 데이터 준비, 멤버변수 정의 등

onStart()

  • 사용자한테 보여지기 직전 호출된다
  • 포그라운드 테스크로서 사용자와 상호작용할 수 있도록 준비한다.
  • 매우 빠르게 완료되는 단계이며 곧바로 onResume()메소드를 호출한다.

onResume()

  • 포그라운드에 Activity가 표시되고 앱이 사용자와 상호작용이 가능한 상태
  • 특정 이벤트가 발생하여 앱에서 포커스가 떠날 때 까지 이 상태에 머무름
    • 전화가 오거나 다른 액티비티로 이동할 때 혹은 기기화면이 꺼질 때
    • 만약 위의 상황이 발생하면 onPause() 콜백 메소드를 호출하게 된다.
    • 위의 상황이 끝나고 다시 액티비티로 돌아오면 onResume()상태로 돌아온다.

onPause()

  • 사용자가 Activity를 떠났을 때 호출되는 콜백 메소드. 즉, Activity가 포그라운드에 있지 않다는 신호
    • 작업을 잠시 중지할 때
      • 전화가 와서 갑자기 영상 일시중지 상태일 때 등
  • Activity가 포그라운드에 없을 때 언젠가 다시 시작할 작업을 일시중지 하는 작업을 수행
  • onPause() 메소드를 사용하여 배터리 수명에 영향을 미칠 수 있는 모든 시스템 리소스, 하드웨어 센서 등을 할당 해제하면 자원을 효율적으로 사용할 수 있다.

 

onPause() 는 아주 잠깐 실행되기 때문에 무언갈 저장하는 작업을 실행하기엔 시간이 부족할 수 있다.

따라서 onPause() 내에서는 사용자 데이터 저장, 네트워크 호출, DB 트랜잭션 등을 실행해서는 안 된다.

이렇게 부하가 큰 작업들은 onStop() 에서 수행해야 한다.

만약 액티비티가 화면에 완전히 보이지 않게 되면, onStop() 이 호출된다

 

onStop()

  • Activity가 더이상 사용자에게 표시되지 않는 상태일 때 onStop()콜백 메서드를 호출한다.
    • 새로운 Activity가 나오는 경우
  • 이 메소드에서는 필요하지 않은 리소스를 해제하거나 조정해야 함.
    • 영상 일시정지, GPS 사용 시 배터리 아끼기 위해 인식 정확도를 세밀한 위치에서 대략적 위치로 전환
    • 또한 CPU를 비교적 많이 소모하는 작업을 종료

onDestroy()

  • Activity가 소멸되기 직전에 호출된다
    • finish() 가 호출되거나 사용자가 앱을 종료하여 액티비티가 종료되는 경우
    • 화면 구성이 변경되어 (기기 회전 등) 일시적으로 액티비티를 소멸시키는 경우
  • onStop()에서 해제하지 않은 모든 리소스를 해제 그렇지 않으면 Memory Leak (메모리 누수) 의 위험이 있다.

onRestart()

  • onStop()상태에 있던 화면이 다시 접근 했을 때 호출되는 콜백함수

액티비티에서 액티비티로 이동할 때 LifeCycle 순서

  • 액티비티에서 문자가 왔을 경우(화면이 일부 가려졌을 때)
    • onCreate() ~ onResume() -> 문자옴 -> onPasue() -> 문자사라짐 -> onResume()
  • A 액티비티에서 B 액티비티로 이동
    • A onCreate() ~ onResume() -> 화면이동 클릭 -> A onPasue() -> B onCreate() ~ onResume() -> A onStop() .. onDestroy() (상황에 따라)
  • 액티비티에서 백그라운드로 갔다 다시 포그라운드로 복귀 시
    • onCreate() ~ onResume() -> 홈버튼(백그라운드) -> onPause() → onStop() -> 앱 복귀 -> onRestart() -> onStart() -> onResume()

Activity와 Fragment의 차이점

  1. 액티비티는 독립적으로 활용할 수 있다.
  2. 프래그먼트는 액티비티에 종속되어 있다.
  3. 액티비티는 전체화면을 차지하지만 프래그먼트는 전체 화면이 아니여도 되며 디자인에 많은 유연성을 가지고 있다.
  4. 액티비티는 자동적으로 스택에 넣어지고 프래그먼트는 트랜잭션을 통해서 요청해야 한다.

Fragment lifecycle

 

Fragment가 시작되고 종료될 때 까지 상태

  • onAttach(Activity)
    • 액티비티에서 프래그먼트가 호출될 때 최초 한번 호출되는 함수
  • onCreate(Bundle)
    • 프래그먼트가 생성될 떄 호출되는 함수
  • onCreateView(LayoutInflater, ViewGroup, Bundle)
    • 프래그먼트의 뷰를 생성하는 함수
  • onActivityCreated(Bundle)
    • 액티비티에서 onCreate()가 호출 된 프래그먼트에서 호출되는 함수
  • onStart()
    • 프래그먼트가 사용자한테 보여지기 직전 호출되는 함수
  • onResume()
    • 프래그먼트가 사용자와 상호작용할 수 있는 상태
  • onPasue()
    • 화면이 일부 가려졌을 때 호출
  • onStop()
    • 프래그먼트가 화면에 사라졌을 때 호출
  • onDestroyView()
    • 프래그먼트의 View가 사라질때 호출되는 함수
  • onDestroy()
    • 프래그먼트가 제거될 때 호출되는 함수
  • onDetach()
    • 프래그먼트가 액티비티와 연결이 종료될 때 호출되는 함수

 

FragmentManager

  • 프래그먼트를 추가, 삭제 또는 교체하고 백스택에 추가하는 등의 작업을 실행하는 클래스
  • 프래그먼트의 변경사항 집합을 트랜잭션이라고 한다.

FragmentTransaction

  • 각 트랜잭션은 수행하고자 하는 변경사항의 집합이다.
  • 변경사항을 설정하려면 add(), remove(), replace()와 같은 메서드를 사용해야한다.