안드로이드 액티비티 종류 - andeuloideu aegtibiti jonglyu

안드로이드 액티비티 종류 - andeuloideu aegtibiti jonglyu
안드로이드 4대 컴포넌트

안드로이드에서 가장 중요한 4대 컴포넌트 액티비티, 서비스, 브로드캐스트 리시버, 콘텐트 프로바이더이다. 

그리고 그외의 인텐트, 인텐트 필터, 노티피케이션, 프래그먼트가 존재한다.

먼저 액티비티(Activity)는 사용자 인터페이스 화면을 구성하는 컴포넌트이다. 다양한 위젯들이 화면안에 구성이되고, 사용자에게 시각적으로 보여지게 된다. 

서비스(Service)는 백그라운드에서 실행되는 컴포넌트이며, 백그라운드에서 실행되기때문에, 시각적인 사용자 인터페이스를 액티비티와 다르게 가지지 않는다. 

인텐트(Intent)는 앱을 개발하다보면 데이터를 주고 받고 싶은 경우가 있다. 이때 인텐트를 사용하여 데이터를 주고 받게 되는데,사용되는 것이 인텐트이다. 액션도 넣을 수 있고, 플래그도 넣을 수도 있다. 메시지라고 생각하면 더 이해가 잘될 것이다.

브로드 캐스트 리시버(Broadcast Receiver)는 브로드캐스트(알려주다), 리시버(받는자), 안드로이드가 알려주는 것을 받는다. 배터리 부족, 언어 설정 변경 등을 수신해서 반응할 수 있다. 이때 배터리가 얼마 만큼이 있을 때 알림을 받을 것인지 설정이 가능한데, 이 역할을 인텐트 필터가 하게 된다.

인텐트 필터(Intent Filter)는 수신할 수 있는 인텐트를 정의하여 컴포넌트를 정의하는 역할을 하는 컴포넌트이다.

콘텐트 프로바이더(Content Provider)는 애플리케이션 간의 데이터 공유를 위해 표준화된 인터페이스를 제공하는 컴포넌트이다. 나의 애플리케이션에서 다른 애플리케이션이 어떤 데이터를 가져갈 수 있게 해줄게 하고 메소드를 하나 만들어 놓고, 다른 어플리케이션에서는 그 메소드를 호출하여 가져가도록 제공한다.

노티피케이션(Notification)는 사용자에게 특정 이벤트를 알리는 컴포넌트이다. 예를 들어서 토스트, 알림바가 있다. 요즘은 서비스, 즉 백그라운드를 사용할 때에 서비스를 사용하고 있따는 노티피케이션을 꼭 띄어줘야한다.

프래그먼트(Fragment)는 액티비티내에서 독자적으로 동작할 수 있는 UI 컴포넌트이다. 액티비티를 반으로 나눌 수 있는 방법이 없는데, 프래그먼트 두개로 나누고 사용하면 가능하다.

액티비티 라이프사이클(Activity LifeCycle)

기존에 실행했던 앱을 또 실행하게 되면 속도가 늦어지게 된다. 그렇기 때문에 안드로이드는 기존에 실행했던 앱을 백그라운드에서 가지고 있다가 사용할 때 다시 가져와서 사용할 수 있도록 라이프사이클을 거치게된다. 단, 내부 스케쥴링에 의해서 내부 메모리가 부족하거나 하면 순차적으로 앱을 종료시켜주기는 한다.

안드로이드 액티비티 종류 - andeuloideu aegtibiti jonglyu
액티비티 생명주기

액티비티 생명주기는 onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDestory()순으로 실행되며, 경우에 따라서 onRestart() 메소드가 호출되기도 한다.

메소드 설명 다음 메소드
onCreate() 액티비티가 생성될 때 호출되며 사용자 인터페이스 초기화에 사용됨. onStart()
onRestart() 액티비티가 멈췄다가 다시 시작되기 바로 전에 호출됨. onStart()
onStart() 액티비티가 사용자에게 보여지기 바로 직전에 호출됨. onResume() 또는 onStop()
onResume() 액티비티가 사용자와 상호작용하기 바로 전에 호출됨. onPause()
onPause() 다른 액티비티가 보여질 때 호출됨. 데이터 저장, 스레드 중지 등의 처리를 하기에 적당한 메소드. onResume() 또는 onStop()
onStop() 액티비티가 더이상 사용자에게 보여지지 않을 때 호출됨. 메모리가 부족할 경우에는 onStop() 메소드가 호출되지 않을 수도 있음. onRestart() 또는 onDestroy()
onDestroy() 액티비티가 소멸될 때 호출됨. finish() 메소드가 호출되거나 시스템이 메모리 확보를 위해 액티비티를 제거할 때 호출됨. 없음

여기서 onStop()과 onDestroy()는 디바이스의 상태에 따라서 불리지 않을 수도 있다.

라이프사이클(LifeCycle) 기본 예제

[activity_main.xml]

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="button1"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

먼저 버튼 하나가 있는 액티비티 레이아웃을 하나 만든다.

그리고, 각종 호출 메소드들에 로그(Log)를 찍어보고, 라이프사이클의 순서를 알아보자!

package com.practice.android_basic_booster_course

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    private val tag = "ActivityLife"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        Log.d(tag,"onCreate()")

        button1.setOnClickListener {
            finish()
        }
    }

    override fun onStart() {
        super.onStart()
        Log.d(tag,"onStart()")
    }

    override fun onResume() {
        super.onResume()
        Log.d(tag,"onResume()")
    }

    override fun onPause() {
        super.onPause()
        Log.d(tag,"onPause()")
    }

    override fun onStop() {
        super.onStop()
        Log.d(tag,"onStop()")
    }

    override fun onRestart() {
        super.onRestart()
        Log.d(tag,"onRestart()")
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.d(tag,"onDestroy()")
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        Log.d(tag,"onSaveInstanceState()")
    }

    override fun onRestoreInstanceState(savedInstanceState: Bundle) {
        super.onRestoreInstanceState(savedInstanceState)
        Log.d(tag,"onRestoreInstanceState()")
    }
}

[앱 실행했을 때]

2020-01-13 23:42:32.237 23852-23852/com.practice.android_basic_booster_course D/ActivityLife: onCreate()
2020-01-13 23:42:32.246 23852-23852/com.practice.android_basic_booster_course D/ActivityLife: onStart()
2020-01-13 23:42:32.248 23852-23852/com.practice.android_basic_booster_course D/ActivityLife: onResume()

[홈 버튼 눌렀을 때]

2020-01-13 23:43:36.401 23852-23852/com.practice.android_basic_booster_course D/ActivityLife: onPause()
2020-01-13 23:43:36.509 23852-23852/com.practice.android_basic_booster_course D/ActivityLife: onStop()
2020-01-13 23:43:36.521 23852-23852/com.practice.android_basic_booster_course D/ActivityLife: onSaveInstanceState()

[다시 앱 실행했을 때]

2020-01-13 23:44:11.707 23852-23852/com.practice.android_basic_booster_course D/ActivityLife: onRestart()
2020-01-13 23:44:11.709 23852-23852/com.practice.android_basic_booster_course D/ActivityLife: onStart()
2020-01-13 23:44:11.713 23852-23852/com.practice.android_basic_booster_course D/ActivityLife: onResume()

[앱 종료했을 때]

2020-01-13 23:45:07.351 23852-23852/com.practice.android_basic_booster_course D/ActivityLife: onPause()
2020-01-13 23:45:08.580 23852-23852/com.practice.android_basic_booster_course D/ActivityLife: onStop()
2020-01-13 23:45:08.582 23852-23852/com.practice.android_basic_booster_course D/ActivityLife: onDestroy()

TIP & TECH 사용자가 홈 키를 눌렀는지를 파악하는 방법
Activity 클래스에는 onUserLeaveHint() 메소드가 제공되고 있다. 이 메소드가 바로 사용자가 홈 키를 눌렀을 때, 호출되는 메소드이다. 그러므로 이 메소드를 재정의해서 원하는 코드를 작성하면 된다. 참고로 이 메소드가 호출된 뒤에는 Activity의 onPause() 메소드가 호출된다.

라이프사이클 전체코드보러가기