코틀린 4장

손현수·2022년 11월 10일

안드로이드 4대 구성요소

  • 액티비티: 사용자에게 사용자 인터페이스 제공
  • 서비스: 백그라운드 조작 수행
  • 브로드캐스트 리시버: 앱의 밖에서 일어나는 이벤트를 앱에 전달
  • 콘텐트 프로바이더: 데이터를 관리하고 다른 앱의 데이터를 사용할 수 있게 함

액티비티

  • 모든 앱에서 4가지 구성요소를 가질 필요는 없으나 액티비티는 최소 하나는 있어야 한다.
  • 액티비티를 작동시키려면 XML 파일에 액티비티의 UI 구성을 먼저 해야 함. 또한 액티비티에 코틀린 코드로 기능을 심고 필요하다면 액티비티 간 전환도 제공해야 함.

액티비티 생명 주기

  • 사람이 태어나자마자 뛰어다닐 수 없듯이 액티비티도 각 상태마다 할 수 있는 행동, 해야 하는 행동이 다르다. 액티비티는 사용자의 활동에 따라 새로운 상태에 들어간다. 그리고 그 상태에 들어가면 시스템은 미리 정의된 콜백 함수를 실행한다.

  • 앱은 총 6가지의 상태가 존재하는데 각 상태에 진입하려면 그에 맞는 콜백 함수가 호출되어야 한다. 예를 들어 onCreate() 함수가 호출되어야 '액티비티가 생성된 상태'가 된다. 앱을 종료하려면 '멈춰진 상태'에서 onDestroy() 함수가 호출되어야 한다.

  • MainActivity.kt 파일을 살펴보면 onCreate() 함수가 보인다. 이 함수가 호출되면서 액티비티를 '생성된 상태'로 만들어준다. 따라서 액티비티에 필요한 초기 설정을 여기서 해주면 된다. 대표적인 초기화 설정에는 보여줄 레이아웃을 선택하는 것이 있다. setContentView() 함수로 사용자에게 보여줄 레이아웃을 지정한다.
  • 정리하면, '생성된 상태'가 되려면 화면이 있어야 하고, 화면이 있으려면 사용할 레이아웃이 뭔지 알아야 한다. 그러므로 '생성된 상태' 이전에는 꼭 레이아웃을 onCreate() 함수에서 지정해주어야 한다.

액티비티가 시작될 때 실행되는 콜백 함수

  • onCreate(): 시스템이 액티비티를 처음 시작할 때 실행된다. 레이아웃 지정이나 클래스 범위 변수를 초기화하는 등, 기본적인 앱 시작 로직을 여기서 구현해준다.
  • onStart(): 액티비티가 '시작된 상태'에 들어가기 직전에 실행된다. 액티비티가 사용자에게 보이지만 사용자와의 상호작용은 아직 준비하는 단계이다. UI 관련 로직을 초기화하는 코드를 작성하면 된다.
  • onResumer(): 액티비티가 '재개된 상태'로 들어가기 직전에 실행된다. 이제 액티비티와 사용자 간의 상호작용이 가능하다. 전화가 온다거나, 사용자가 다른 액티비티로 이동하는 등 포커스를 잃는 경우가 아닌 이상 액티비티는 '재개된 상태'로 존재한다.

액티비티가 호출될 때 실행되는 콜백 함수

  • onPause(): 사용자가 액티비티를 떠나는 경우 처음 실행되는 콜백 함수이다. 더는 액티비티에 포커스가 없다. 여기서 액티비티가 보이지 않을 때 더 이상 실행할 필요가 없는 부분들을 비활성화해주면 된다. 주의할 점은 onPause() 함수가 지속되는 시간이 굉장히 짧으므로 여기서 사용자의 정보를 데이터베이스에 저장하거나, 네트워크 호출을 하는 등 중요하거나 시간이 오래 걸리는 작업을 수행하면 안 된다. 이와 같은 부하가 큰 작업은 onStop() 함수를 활용한다.
  • onStop(): 액티비티가 사용자에게 더 이상 표시가 안 되는 '중단된 상태'에 들어가기 직전에 실행되는 콜백 함수이다. 여기서는 데이터베이스에 정보를 저장하는 일처럼 부하가 큰 작업을 할 수 있다.
  • onDestroy(): 액티비티가 완전히 소멸되기 직전에 호출되는 함수이다.

액티비티 간의 화면 전환

  • 화면 전환은 곧 액티비티(혹은 프래그먼트) 전환이다. 여기서 중요한 개념이 인텐트(Intent)이다. Intent의 사전적 의미는 의지, 의향이다. 무엇을 하고 싶은지 인텐트 객체를 이용하여 나타내는 것이다. 인텐트 객체를 사용하면 액티비티뿐만 아니라 안드로이드 4대 구성요소를 자유롭게 넘나들 수 있다. 인텐트 객체는 사용자의 다양한 요청을 알맞은 구성요소에게 보내준다.

  • ActivityAndFragment 프로젝트를 만든 후 MainActivity.kt 파일과 SubActivity.kt 파일을 만든다.(MainActivity 마우스 우클릭 [new]->[Activity]->[Empty Activity]->Activity Name을 Subactivity로 설정) MainActivity에 Go to SubActivity 버튼을 만들고 SubActivity에 SubActivity 텍스트 뷰를 만든다. 이제 버튼이 클릭되면 SubActivity로 넘어가게끔 MainActivity.kt 파일에 다음과 같이 코드를 작성한다.

프래그먼트

  • 프래그먼트는 액티비티 안에서 액티비티의 일정 부분을 차지함. 한 액티비티에서 여러 프래그먼트를 보여줄 수도 있고 같은 프래그먼트를 여러 액티비티에서 재사용할 수도 있다.
  • 프래그먼트의 사전적 정의는 '파편', '조각'이다. 한 화면의 UI를 분할하는 데 사용한다.
  • 한 화면에 영상 리스트와 영상 재생 영역을 함께 보여주려면 화면을 쪼개야 한다. 이때 프래그먼트를 사용
  • 프래그먼트의 특징
  1. 꼭 액티비티 안에 종속되어야 한다.
  2. 액티비티의 생명 주기에 영향을 받지만, 프래그먼트 고유의 생명 주기가 존재한다.
  3. 액티비티가 실행 중일 때 프래그먼트를 추가하거나 제거할 수 있다.
  • 프래그먼트는 분활된 화면을 독립적으로 활용하고 재사용하기에 안성맞춤이다.

프래그먼트의 생명 주기

  • 프래그먼트의 생명 주기는 액티비티의 생명 주기에 영향을 받기 때문에 액티비티의 상태에 따라 프래그먼트가 호출할 수 있는 함수의 범위가 달라진다.

프래그먼트의 화면 전환

  • 앞 절에서 만든 ActicityAndFragment 프로젝트를 그대로 사용
  • File -> New -> Acticity -> Empty Activity 를 선택하여 새로운 액티비티를 생성한다.
  • 이름은 TwoColorActivity로 설정하고 이번에는 직접 레이아웃 코드를 작성한다.

  • 프래그먼트가 들어가기 전 프레임 레이아웃의 색상을 노란색으로 지정해두었다. 프레임 레이아웃은 프레임, 즉 틀의 역할을 해주는 레이아웃이라고 생각하면 된다. 여기에 프래그먼트를 넣을 수가 있다.
  • 버튼을 생성한 후에 꼭 id를 넣는 것을 잊지 말아야 한다. 그래야 소스 코드에서 xml에 만든 버튼을 특정할 수 있기 때문이다. 빨간색 프래그먼트를 불러오는 버튼이므로 button_red_fragment라는 id값을 주었다.
  • 같은 이유로 button_blue_fragment라는 id값을 주었다.

  • 실제 기기를 이용해 실행하기 전에 꼭 해주어야 하는 작업이 있다. 액티비티를 배운 이후에 새로운 프로젝트를 생성하지 않고 추가적으로 액티비티와 프래그먼트를 생성했는데 프로젝트는 기본적으로 MainActivity를 앱을 켰을 때 처음 나오는 액티비티로 지정을 한다. 이것을 TwoColorActivity로 바꾸어준다.
    [app]->[manifests]->AndroidManifest.xml 파일 열기-> intent filter 태그를 어디에 위치시키느냐에 따라서 어디가 시작 지점이 될지가 결정된다. MainActicity태그 안에 있던 intent-filter 태그를 복사한 후 지운다. 그 후에 TwoColorActicity 태그 안에 붙여넣기 하여 위치시켜주면 TwoColorActicity를 첫 화면으로 설정한 것이다.
profile
안녕하세요.

0개의 댓글