코틀린(Kotlin)/TIL

[코틀린(Kotlin)] 액티비티(Activity)와 인텐트(Intent)

초보왕보초 2023. 12. 14. 20:03
728x90

안드로이드의 4대 컴포넌트

안드로이드 애플리케이션은 주로 네 가지 주요 컴포넌트로 구성된다

이들은 애플리케이션의 구조를 정의하고, 안드로이드 시스템과 어떻게 상호 작용하는지를 결정한다

  1. 액티비티(Activity)
    - 액티비티는 사용자가 직접 상호작용하는 화면을 말한다.
    예) 이메일 앱에서 이메일 목록을 보여주는 화면, 이메일 작성 화면 등이 각각 독립된 액티비티이다
    - 사용자 인터페이스(UI)를 담당하며, 사용자의 입력에 반응하는 이벤트 기반 프로그래밍을 가능하게 한다

  2. 서비스(Service)
    - 서비스는 백그라운드에서 오랜 시간 동안 실행 되어야 하는 작업을 수행한다
    예) 음악재생, 파일 다운로드 등
    - 사용자가 직접적으로 인지하지 못하는, 애플리케이션의 '백스테이지'에서 일어나는 작업

  3. 브로드캐스트 리시버(Broadcast Receiver)
    - 브로드캐스트 리시버는 안드로이드 시스템으로부터 발송되는 다양한 이벤트나 정보를 애플리케이션이 받을 수 있게 해주는 컴포넌트이다.
    예) 배터리 부족 경고, 화면 꺼짐 등의 시스템 이벤트를 처리할 때 사용된다
    - 애플리케이션은 브로드캐스트 메시지를 구독하고, 해당 이벤트가 발생했을 때 반응할 수 있다

  4. 콘텐츠 프로바이더(Content Provider)
    - 콘텐트 프로바이더는 애플리케이션 간의 데이터 공유를 가능하게 한다.
    예) 연락처 애플리케이션이 다른 애플리케이션에 연락처 데이터를 제공할 때 사용된다
    - 데이터를 저장하고 관리하는 일종의 데이터베이스 역할을 하며, 다른 애플리케이션에 안전하게 데이터를 공유한다

 

 

 

1. 액티비티(Activity)

위에서 말했듯, 상호 작용하는 창을 의미한다.

각 액티비티는 하나의 창을 가지며, 이 창에서 '뷰(View)'라고 불리는 객체들을 통해 사용자 인터페이스를 구성한다

  • 모든 Activity 컴포넌트는 Android Manifest 파일에 등록되어야 한다
  • AndroidManifest.xml란? 애플리케이션의 기본 구조를 정의하고, 시스템이 앱을 어떻게 실행해야 하는지를 알려주는 중요한 지시사항을 담고 있다

 

 

 

2. 인텐트(Intent)

인텐트는 일종의 메시지 객체이며, 인텐트를 사용해 다른 앱 구성요소(액티비티, 서비스, 브로드 캐스트리시버)로 작업을 요청할 수 있다

 

2-1 명시적 인텐트(Explicit Intent)

특정한 컴포넌트를 직접적으로 호출할 때 사용되는 인텐트이다

  • 개발자가 인텐트 객체에 시작하고자 하는 구성 요소의 이름을 명확하게 설정하고 startActivity() 또는 startService() 메서드를 통해 해당 컴포넌트를 실행시킨다
  • 주로 앱 내부에서 다른 액티비티나 서비스를 시작할 때 사용된다
    예) 메인 액티비티에서 사용자의 입력을 받아 세부 정보를 표시하는 새로운 액티비티를 띄울 때

 

 

2-2 암시적 인텐트(Implicit Intent)

특정한 컴포넌트를 명시하지 않고, 수행하고자 하는 일반적인 작업을 인텐트 객체에 설정하여 startActivity() 메서드에 넘김

이때, 안드로이드 시스템은 이 인텐트를 처리할 수 있는 모든 애플리케이션을 검색하여 적합한 인텐트 필터를 가진 컴포넌트를 찾아 실행시킨다

( = 인텐트는 안드로이드 앱의 구성 요소들 사이에서 실행을 위임하거나 정보를 전달하는 역할을 한다 )

 

  • 인텐트 필터
    특정 인텐트에 반응하는 액티비티, 서비스 또는 브로드캐스트 리시버의 능력을 정의한다.
    (= 어떤 인텐트를 수신할 준비가 되어 있는지를 나타내는 설정)
  • 일반적인 사용
    암시적 인텐트는 주로 다른 앱의 컴포넌트를 실행시키는 데 사용된다
    예) 사용자가 '지도 보기'를 요청할 때, 해당 작업을 처리할 수 있는 모든 앱 중 사용자가 선택할 수 있도록 안드로이드 시스템이 목록을 제공한다

암시적 인텐트

 

 

2-3. 인텐트의 주요 구성요소

  1. 컴포넌트 이름(Component Name)
    - 타겟 컴포넌트의 이름을 명시하여, 인텐트가 전달될 정확한 대상을 지정한다
    예) new Intent(context, TargetActivity.class)에서 TargetActivity가 컴포넌트의 이름이다
    - 컴포넌트의 이름이 없으면, 인텐트는 암시적으로 처리되고 시스템이 적절한 대상을 찾는다

  2. 액션(Action)
    - 인텐트가 수행해야 할 일반적인 작업을 정의한다
    예1) Intent.ACTION_VIEW는 사용자에게 데이터를 보여줄 때 사용
    예2) Intent.ACTION_DIAL은 전화 다이얼을 열기 위해 사용

  3. 데이터(Data)
    - 작업을 수행하는 데 필요한 데이터의 URI를 지정한다
    예) Uri.parse("tel:12345")는 전화 앱에 전화번호 데이터를 제공
    - 데이터는 보통 Uri 객체로 액션과 결합하여 사용된다

  4. 카테고리(Category)
    - 인텐트의 유형을 더 구체적으로 지정하여, 어떤 컴포넌트가 처리할 수 있는지 알려준다
    예) Intent.CATEGORY_HOME은 홈 화면 애플리케이션을 시작할 때 사용된다

  5. 엑스트라(Extras)
    - 복잡한 데이터를 인텐트에 전달하기 위한 키-값 쌍의 추가 정보
    예) intent.putExtra("extra_key", "value")에서 extra_key는 전달할 데이터의 키이며, value는 실제 값
    - 엑스트라를 통해 기본 타입부터 Serializable 객체까지 다양한 데이터를 전달할 수 있다

 

 

2-4.  액티비티 간의 데이터 전달

Extras를 활용하여 이름과 값의 쌍으로 된 정보를 전달해 줄 수 있다

  • Extras에 값을 저장하는 메서드
    - intent.putExtra(String name, int value)
    - intent.putExtra(String name, String value)
    - intent.putExtra(String name, boolean value)
  • Extras에 저장된 값을 읽는 메서드
    - int : getIntExtra(String name, int defaultValue)
    - String : getStringExtra(String name)
    - boolean : getBooleanExtra(String name, boolean defaultValue)

 

 

2-5. 액티비티와 인텐트를 활용해 보기

activity_first의 UI

  • TextView - "첫번째 액티비티 입니다"
  • Button - "두번째 액티비티 시작하기", "다이얼 작업 시작하기", "지도보기 작업 시작하기", "세번째 액티비티에 데이터 전달"
  • EditText - hint = "데이터 입력" / "yyg864(에뮬레이터에서 입력함)"

 

FirstActivity.kt

activity_first.xml의 뷰(View)들에 각각의 코드 입력

 

"두번째 액티비티 시작하기" 버튼 결과

  • TextView - "두번째 액티비티 입니다"
  • Button - "닫기" 눌렀을 때 finish()

 

"다이얼 작업 시작하기" 버튼 결과

 

다이얼 기능이 가능한 시스템 목록 중 전화를 '선택'한 화면

 

"지도보기 작업 시작하기" 버튼 결과

 

"세번째 액티비티에 데이터 전달" 버튼 결과

  • TextView - "세번째 액티비티 입니다"
  • EditText - "yyg864" = 첫 번째 액티비티에서 전달받은 strData값(=yyg864)
  • Button - "닫기" 눌렀을 때 finish()

 

 

3. 액티비티 생명주기

액티비티의 생명주기

  • 액티비티의 수명
    - onCreate() 호출과 onDestroy() 호출 사이에 있다
    - onCreate()란? 액티비티가 생성되어 레이아웃 설정등을 수행하는 메서드
    - onDestroy()란? 호출되는 시점에 사용되고 있는 리소스를 모두 해제하고 종료되는 메서드

  • 액티비티의 화면이 눈에 보이게 되는 Visibility
    - onStart()에서 onStop() 호출 사이에 있음
    - 이 기간 중에는 사용자가 액티비티를 화면에서 보고 이와 상호작용 할 수 있다
    - onStop()이 호출되어 새 액티비티가 시작되면 이 액티비티는 더 이상 표시되지 않는다
    - 시스템은 액티비티의 전체 수명 내내 onStart() 및 onStop()을 여러 번 호출할 수 있다
    - 이때, 액티비티는 사용자에게 표시되었다가 숨겨지는 상태를 오간다
  • 액티비티가 foreground에서 동작하는 구간
    - onResume()에서 onPause() 호출 사이를 말한다
    - 이 기간 중에는 이 액티비티가 화면에서 다른 모든 액티비티 앞에 표시된다
    - 사용자 입력도 여기에 집중된다
    - 액티비티는 전경에 나타났다 숨겨지는 전환을 반복할 수 있다
    예) 기기가 절전모드에 들어가거나, 대화상자가 나타나면 onPause() 호출

  • 수명주기 콜백 메서드
    - 액티비티가 생성되면서 해제될 때까지 액티비티의 상태에 따라서 불려지는 메서드 (= 라이프 사이클 콜백 메서드)
    - 애플리케이션 개발자는 필요한 경우에 해당 콜백 메서드를 재정의하여 필요한 일을 수행하게 할 수 있다

주요 콜백 메서드

 

  • onCreate()
    - Activity가 시작될 때 불리는 메서드, 생명주기동안 최초실행 시 딱 한 번만 실행된다
    예) 화면 레이아웃 정의, 뷰(View) 생성
  • onStart()
    - Activity가 보이기 전에 호출되는 메서드, 화면에 진입할 때마다 실행되어야 하는 코드가 있다면 onStart()에 작성
  • onResume()
    - Activity의 일부가 보일 때 호출, 잠시 액티비티가 일시정지 되었다가 돌아오는 경우에 호출된다
    - 일부가 보일 때부터, 전체가 보일 때까지의 시간만큼만 수행되기 때문에 가벼운 작업만 수행해야 한다
  • onPause()
    - 방해되는 이벤트가 발생하고 Activity의 일부는 보이지만 다른 Activity가 foreground로 나올 때 호출된다
    - onPause()는 아주 잠깐 실행되는 메서드이다
    - 그래서 메서드가 완료되기 전에 작업이 끝나지 않을 수 있다
    - 때문에 데이터를 저장하거나, 네트워크를 호출하는 등 무거운 작업을 하면 안 된다 
  • onStop()
    - Activity가 사용자에게 더 이상 보이지 않을 때 호출, onPause()에서 경고한 무거운 작업을 onStop()에서 처리하자
    예) 애플리케이션을 통해 영상을 보다가 다른 작업 때문에 백그라운드로 이동시켰을 때 onStop()을 활용해서 영상을 멈추도록 하기 or 노래 재생
  • onRestart()
    - 사용 중인 앱에서 홈으로 나갔다가 다시 돌아오거나 다른 Activity로 갔다가 뒤로 가기 버튼을 통해 돌아오는 경우 호출
  • onDestroy()
    - 활동이 종료되는 경우나 구성변경(기기회전 등)으로 인해 시스템이 일시적으로 활동을 소멸시키는 경우에 호출
    예) onDetsroy()에 메모리를 해제하도록 하기

 

 

  • FirstActivity에서 SecondActivity 시작 과정
    1. FirstActivity의 onPause()
    2. SecondActivity의 onCreate() → onStart() → onResume()
    3. FirstActivity의 onStop()

FirstActivity에서 SecondActivity로 이동시 콜백 메서드

 

  • 단말기의 뒤로 가기 버튼 눌렀을 경우(SecondActivity → FirstActivity)
    1. SecondActivity의 onPause()
    2. FirstActivity의 onRestart() → onStart() → onResume()
    3. SecondActivity의 onStop() → onDestroy()

SecondActivity에서 단말기 뒤로가기 버튼을 이용해 FirstActivity로 이동시 콜백 메서드

728x90