안드로이드 면접대비 _ 1

안드로이드 면접 질문

  1. Thread간 통신방법
  2. Context
  3. Activity의 생명주기
  4. Fragment의 생명주기
  5. Content Provider VS Content Resolver
  6. XML 기반 레이아웃이 중요한 이유
  7. Manifest
  8. Vector VS Bitmap
  9. ConstraintLayout

원본출처


Thread간 통신방법

Android의 UI를 담당하는 스레드는 메인 스레드(UI 스레드)인데, 오랜 시간이 걸리는 작업을 메인스레드에서 수행할 경우 앱의 성능이 저하된다. 따라서 여분의 스레드를 사용하여 작업을 수행해야하고, 이 결과를 반영하기 위해 메인 스레드와의 통신이 필요하게 된다. 그래서 메인 스레드에 접근하는 방법으로 Looper와 Handler를 이용하면 된다. 그리고 UI 작업을 메인 스레드에서만 담당하는 이유는 두 개 이상의 스레드를 사용할 때의 동기화 이슈를 차단하기 위함이다.

Android는 Java의 스레드를 좀 더 쉽게 사용할 수록 래핑한 HandlerThread, AsyncTask를 제공한다.

참고 : https://developer.android.com/training/multiple-threads/communicate-ui

Looper

메인 스레드는 내부적으로 Looper를 가지며 그 안에는 Message Queue가 포함된다. Message Queue는 스레드가 다른 스레드나 혹은 자기 자신으로부터 전달받은 Message를 보관하는 Queue이다(FIFO). Looper는 무한 루프를 돌며 자신이 속한 스레드의 Message Queue에서 Message 객체를 차례로 꺼내 Handler가 처리하도록 전달한다.

메인 스레드는 기본적으로 Looper가 생성되어 있으나, 새로 생성한 스레드는 새로운 Looper를 생성해주어야한다. Android는 Looper가 기본적으로 생성되어있는 HandlerThread를 제공한다.

Message Queue에 저장되는 객체
  • 문자와 필드로 구성된 Message 객체
  • Runnable 객체

Handler

Looper로부터 받은 Message를 실행, 처리하거나 다른 스레드로부터 메시지를 받아서 Message Queue에 넣는 역할을 하는 스레드 간의 통신 장치이다. 일반적으로 UI 갱신을 위해 사용한다.

ANR(Application Not Responding)

오랜 시간이 걸리는 작업을 메인 스레드에서 담당하면 앱의 반응성이 낮아질 수 있고, 사용자의 불편함을 방지하고자 시스템이 ANR 상태로 전환시킬 수 있다. 따라서 시간이 걸리는 작업은 여분의 스레드를 사용해야하고, 이 작업 결과를 반영하기 위해 메인 스레드와의 통신하는 방법이 필요하다.

ANR 상태 예시
  • input 이벤트에 5초 안에 반응하지 않을 경우
  • BroadcastReceiver가 10초 내로 실행하지 않을 경우(UI가 없는 브로드캐스트 리시버와 서비스도 실행 주체가 메인스레드이기 때문에)
ANR 대처 방법
  • 긴 작업은 스레드로 처리
  • Progress bar로 진행 상황을 보여주어 사용자를 기다리게한다.

백그라운드에서 UI를 업데이트 하는 방법

  • Handler.post
  • 메인스레드 안에서 Handler를 생성하고 다른 스레드에서 메시지 넣기
  • runOnUiThread
  • AsyncTask의 onProgressUpdate, onPostExecute

싱글 스레드 모델

Android UI를 구성하는 뷰나 뷰 그룹을 하나의 스레드에서만 담당하는 원칙을 싱글 스레드 모델이라고 한다. 싱글 스레드 모델의 규칙은 다음과 같다.

  1. 메인 스레드(UI 스레드)를 block 하지 말 것.
  2. Android UI 툴킷은 오직 메인 스레드에서만 접근할 수 있도록 할 것.

참고 : 안드로이드 백그라운드 잘 다루기 Thread, Looper, Handler

위로


Context

요약 : 현재 사용되고 있는 어플리케이션(또는 액티비티)에 대한 포괄적인 정보를 지니고 있는 객체

  • 어플리케이션의 정보에 접근하기 위한 인터페이스.
  • Context 를 사용하면 getPackageName() , getResource등과 같이 어플리케이션에 대해 시스템이 관리하는 정보에 접근할 수 있으며 startActivity() , bindService 등과 같이 안드로이드가 제공하는 시스템 서비스를 사용할때도 된다.
  • 보통 다른 프로그램에서 시스템 레벨에서 제공하는 전역 정보에 접근하기 위해 System 정적 클래스에 접근하는 것과 비슷한 맥락이다.
  • 안드로이드에서는 어플리케이션 관리를 시스템에서 하는 것이 아니라 별도의 ActivityManagerService 라는 또다른 어플리케이션이 관리하고 있기 때문에 어플리케이션과 연관된 시스템 레벨의 함수를 호출하려면 ActivityManagerService 를 통해야 한다.
  • 따라서 ActivityManagerService 에게 자신이 어떤 어플리케이션인지 알리고 시스템 레벨의 함수에 접근하기 위해서 Context 객체가 필요한 것.

참고 : Context란?

위로


Activity의 생명주기

  • onCreate : 액티비티가 처음 생성되었을 때 호출된다. 여기서 일반적인 정적 설정을 모두 수행해야 하며 이전 상태(intent)가 캡쳐된 경우 이것을 포함한 번들 객체가 전달된다. 항상 뒤에는 onStart가 따라온다.

  • onRestart : 액티비티가 중단되었다가 다시 시작되기 직전에 호출된다. 항상 뒤에는 onStart가 따라온다.

  • onStart : 액티비티가 사용자에게 보여지기 직전에 호출된다. 액티비티가 전경으로 나오면 onResume이 따라오고 액티비티가 숨겨지면 onStop이 따라온다.

  • onResume : 액티비티가 화면에 보여지고 사용자와 상호작용하기 직전에 호출된다. 이 시점에 액티비티는 액티비티 스택의 최상단에 위치한다. 항상 뒤에는 onPause가 뒤따라온다.

  • onPause : 다른 액티비티로 넘어가거나, 뒤로 가기를 누르거나, 홈으로 돌아가는 등 현재 액티비티가 사라지기 직전에 호출된다. 데이터를 유지하기 위해 저장하거나 스레드 중지 또는 앱이 종료되기 직전에 실행할 기능 등을 처리하기에 적당하다. 무슨 일은 하든 매우 빨리 끝내야 한다. 이 메서드가 반환될때까지 다음 액티비티가 재개되지 않기 때문이다. 액티비티가 다시 전경으로 돌아오면 onResume이 뒤따라오고, 액티비티가 보이지 않게 되면 onStop이 뒤따라온다.

  • onStop : 액티비티가 더이상 사용자에게 보여지지 않을 때 호출된다. 항상 호출되는 것은 아니며 메모리가 부족할 경우 호출이 안될 수 있다. 액티비티가 다시 전경으로 돌아오면 onRestart가 뒤따라오고 액티비티가 그대로 사라지면 onDestroy가 뒤따라온다.

  • onDestroy : 액티비티가 소멸되기 직전에 호출된다. 호출이 안될 경우도 있기에 만약 액티비티가 종료되는 상황에 반드시 처리할 작업이 있다면 onPause에서 처리를 해야한다. 시스템이 비상 시에 메모리를 복구해야 할 경우 onStop과 onDestroy는 호출되지 않을 수도 있다. 따라서, 중요한 영구적 데이터를 보관할 경우 onPause()를 사용해야한다.

참고 : Activity Lifecycle, 내블로그1, 내블로그2


Q. 앱을 사용하는 도중에 카카오톡 메세지가 온다면 사용하던 앱의 TopActivity의 생명주기는 어떤 상태가 되나?

A. onPause()

Q. 데이터를 불러오는 작업은 어디서 해야하나?

A. 기본적으로 onCreate()

추가적으로 볼 것 : When exactly are onSaveInstanceState() and onRestoreInstanceState() called?

Q. 다른 액티비티가 상단에 올라오면 어떤 상태인가?

A. 실행중이던 액티비티는 onPause() - onStop()

Q. onRestart는 언제 호출 되나?

A. (다른 액티비티에 깔려서) onStop 상태에 있다가 다시 돌아오면 호출

Q. 화면이 회전하면?

A. onPause() - onStop() - onDestroy() - onCreate() - onStart() - onResume(). 현재 액티비티를 destroy 하고 새로 생성하기 때문에, 기존 데이터를 유지하기 위해서는 onSaveInstanceState()에서 Bundle에 데이터를 저장하도록 오버라이드해야한다.

위로


Fragment의 생명주기

최초 생성 LifeCycle
  1. onAttatch() : Fragment가 Activity에 붙을 때 호출
  2. onCreate() : Activity에서의 oncreate()와 비슷, ui관련 작업X
  3. onCreateView() : Layout을 inflater하여 View 작업
  4. onActivityCreated() : Activity에서 Fragment를 모두 생성하고 난 다음 호출, 액티비티의 onCreate()에서 setContentView()한 다음이라고 생각 하면 쉽게 이해 될것 같다. 여기서 부터는 ui변경작업이 가능하다.
  5. onStart() Fragment가 화면에 표시될때 호출된다. 사용자의 Action과 상호 작용 할 수 없다.
  6. onResume()

Fragment가 화면에 완전히 그렸으며, 사용자의 Action과 상호 작용이 가능하다.

다른 Fragment가 add
  1. onPause() :Fragment가 사용자의 Action과 상호 작용을 중지
  2. onStop() :Fragment가 화면에서 더이상 보여지지 않게 되며, Fragment기능이 중지 되었을때 호출
  3. onDestoryView() : View 리소스를 해제 할수 있도록 호출, backstack을 사용 했다면 Fragment를 다시 돌아 갈때 onCreateView()가 호출
Replace or backward로 removed되는 경우
  1. onDestory() :Fragment상태를 완전히 종료 할 수 있도록 호출 한다.
  2. onDetach() :Fragment가 Activity와 연결이 완전히 끊기기 직전에 호출 된다.

위로


Content Provider VS Content Resolver

  • Content Provider : 어플리케이션 내에서 사용할 수 있는 데이터를 ‘공유’하기 위한 컴포넌트

    Ex) 연락처,이미지 등 (카카오톡)

  • Content Resolver : 앱이 ContentProvider를 접근할 때에는, Content Resolver를 통해 접근하게 됨. 기본적으로 CRUD 함수들 제공 -> 다른 앱의 데이터베이스를 조작할 수 있음.

    Ex) contentResolver.query()

위로


XML 기반 레이아웃이 중요한 이유

동작을 제어하는 코드로부터 분리시킬 수 있고, UI의 구조를 시각화하기 더 쉽기 때문이다. 소스로 레이아웃을 작성했다면, 레이아웃을 변경할 때마다 재컴파일 해야하는 번거로움이 있다.

위로


Manifest

애플리케이션에 대한 필수적인 정보를 안드로이드 플랫폼에 알려준다. 모든 안드로이드 앱은 반드시 AndroidManifest.xml 파일을 자신의 루트 디렉토리에 가지고 있어야한다.

위로


Vector VS Bitmap

  • Vector : 리사이징이 되어도 전혀 깨지지 않음. 모든 해상도에서 자유자재로 활용할 수 있기 때문에 특정 해상도에 제한되어 있지 않다는 것이 핵심. Ex) SVG
  • Bitmap : 픽셀로 구성되어 있다. 자유자재로 바꿀 수가 없고 움직일 수도 없다. Ex) PNG, JPEG

위로


ConstraintLayout

  • ConstraintLayout 은 뷰의 상하좌우를 주변 또는 부모 뷰와 연관을 지어 위치시킬 수 있다.
  • bias 를 통해 비율적으로 배치시킬 수도 있고, chain 을 사용하여 마치 그룹화한 것처럼 사용할수도 있다.
  • ratio 를 사용하여 너비와 높이를 비율대로 설정할 수도 있는 등 유연한 배치가 가능하다.
  • ConstraintLayout 의 가장 큰 장점은 View Hierarchy 를 수평적으로 평평하게 만든다는 것이다.
  • 최대 8계층으로 구성되어 있는 RelativeLayout 구조를 하나의 계층으로 줄일 수 있는 효과를 볼 수 있다.

참고 : Constraint Layout, Android developer docs

위로

Share