[Lecture] 안드로이드 앱개발 4주차

Minjun Kim·2023년 8월 3일
0
post-thumbnail

액티비티


1. Activity

화면을 구성하는 가장 기본적인 UI

  • 하나의 화면 = 하나의 액티비티

01. Activity 개요

  • 사용자와 상호 작용 할 수 있는 화면을 제공하는 애플리케이션의 구성요소

  • View를 상속받은 Activity가 Window에 출력된다.
    (사용자 인터페이스는 View객체들로 구성)

02. 액티비티와 사용자 인터페이스 연결

  • setContentView() 를 이용하여 액티비티에 사용자 인터페이스를 정의한 View를 설정

03. 액티비티 등록

  • 모든 Activity컴포넌트는 Android Manifest 파일 에 등록되어야 한다.

04. Android Manifest 역할

  • 애플리케이션 패키지 이름 (애플리케이션의 고유한 식별자 역할) 설정

  • 애플리케이션 구성요소들을 설명

  • 이 애플리케이션과 상호작용하는 다른 애플리케이션이 가져야할 권한 설정

  • 애플리케이션에서 사용하는 라이브러리 설정

  • 애플리케이션이 필요로 하는 Android API의 최소 수준 설정


인텐트


1. Intent

  • 일종의 메시지 객체임

  • 이것을 사용해 다른 앱 구성요소 (액티비티, 서비스, 브로드 캐스트리시버)로 작업을 요청 할 수 있다.

  • 액티비티 시작하기

  • 서비스 시작하기

  • 브로드캐스트 전달하기

2. Intent의 유형


01. 명시적 인텐트 (Explicit Intent)

  • 객체명을 지정해서 startActivity() 또는 startService() 에 넘긴다.

  • 보통 본인의 앱 내의 구성요소에 사용

02. 암시적 인텐트 (Implicit Intent)

  • 객체명 없이 일반적인 작업 (전화걸기, 지도)을 인텐트 객체에 설정하고 startActivity() 에 넘긴다.

  • 안드로이드 시스템 이 모든 앱을 검색 후 해당 인테트 필터 에 적합한 앱 구성 요소를 띄어준다.
    📡 인텐트 필터 : 해당 구성 요소가 수신하고자 하는 인텐트의 유형

  • 보통 다른 앱 안에 있는 구성 요소를 구동하는데 사용

03. Intent의 객체

  • 안드로이드 시스템에 필요한 데이터를 담아 넘긴다.

1) 컴포넌트 이름 (Component Name)

  • 호출할 구성 요소의 이름

  • 선택 항목이므로, 컴포넌트 이름을 지정하지 않으면 암시적 인텐트를 의미한다.

2) 작업 (Action)

  • 수행되어야 할 작업을 나타내는 문자열

3) 데이터 (Data)

  • 작업에 필요한 데이터

  • 데이터는 URI 형식 으로 설정
    🔎 URI : 정보의 고유한 명칭으로 웹 주소를 나타내는 URL 보다 더 상위의 개념

🧩 전화걸기(작업) 을 위해 전화번호(데이터) 를 넘김


4) 카테고리 (Category)

  • 작업에 대한 추가적인 정보 제공

5) 엑스트라 (Extra)

  • 요청한 작업을 수행하기 위해 필요한 추가정보를 담고 있는 K-V 쌍의 데이터
    🧩 이메일 답장 클릭 -> 새로운 액티비티 호출 -> 이 때 도착 이메일 주소를 같이 넘김 (엑스트라 값)

04. 명시적 인텐트 사용

  • val intent = Intent(넘겨줄 애플리케이션 컨텍스트 정보, 시작하고자 하는 액티비티 클래스)
  val intent = Intent(this, SecondActivity::class.java)
  startActivity(intent)


  class FirstActivity : AppCompatActivity() {
      override fun onCreate(savedInstanceState: Bundle?)
          super.onCreate(savedInstanceState)
          setContentView(R.layout.activity_first)

          val btn = findViewById<Button>(R.id.btn1)

          btn.setOnClickListener {
              val intent = Intent(this, SecondActivity::class.java)
              startActivity(intent)
          }
      }
  }

05. 암시적 인텐트 사용

  • 암시적 인텐트는 작업데이터 를 지정해야 한다.
🧩 114 번호로 다이얼 작업을 수행하는 액티비티 실행

val call_intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:114"))
startActivity(call_intent)

06. 암시적 인텐트 수신 (인텐트 필터)

  • 암시적 인텐트를 수신하려면, 인텐트 필터<intent-filter> 요소매니페스트 파일에 선언

  • 각 인텐트 필터가 인텐트의 작업, 데이터 및 카테고리 를 근거로 어느 유형의 인텐트를 수신할 지를 결정한다.

1) AndroidManifest.xml 에서 수신 받을 액티비티의 <activity>요소 하위에 <intent-filter>태그를 추가한다.

2) android:label 속성이 지정되어 있지 않다면, 값을 지정해주자.

📌 암시적 인텐트를 통과시킨 인텐트 필터를 포함한 구성요소가 하나 이상인 경우,
	해당 구성요소의 android:label 속성 값을 바탕으로 나열된다.

액티비티 간의 데이터 전달


1. 데이터 전달 방법

- 인텐트에 컴포넌트 실행을 요청할 때 데이터를 함께 전달하려면 엑스트라 데이터를 이용한다.

- 엑스트라 데이터는 인텐트에 담는 부가 정보라 할 수 있다.

- Extras를 활용하여 이름과 값의 쌍으로된 정보를 전달

2. Extras에 값을 저장하는 메소드

- Intent putExtra(String name, int value)

- Intent putExtra(String name, String value)

- Intent putExtra(String name, boolean value)

3. Extras에 저장된 값을 읽는 메소드

- int getIntExtra(String name, int defaultValue)

- String getStringExtra(String name)

- boolean getBooleanExtra(String name, boolean defaultValue)

액티비티 생명주기

1. 왜 생명주기가 필요할까?

  • 액티비티의 상태 에 따라 처리해야 할 상황이 존재하기 때문

    🧩 영상 다운로드 중 사용자가 홈 버튼이나 다른 앱을 실행 했을 경우, 백그라운드에서 계속 다운로드할 수도 있지만, 다운로드를 멈춰야 하는 상황일 수도 있다. 그 때 Paused에 알맞는 처리를 해주어야 한다.

    🧩 유튜브 프리미엄 가입 시 백그라운드에서도 음악 재생 가능
    -> 미가입의 경우 onStop() 에 음악을 멈추는 코드 작성

2. 액티비티의 수명

  • onCreate() 호출과 onDestroy() 호출 사이에 있다.

01. onCreate() 란?

- 최초 실행

- 액티비티가 생성되어 레이아웃 설정 등을 수행

02. onDestroy() 란?

- 액티비티 종료

- 호출되는 시점에 사용하고 있는 리소스를 모두 해제하고 생을 마감

03. 액티비티의 화면이 눈에 보이는 상태 Visibility

- onStart() 에서 onStop() 호출 사이에 있다. (Started, Resumed, Paused)

- 이 기간 중에는 사용자가 액티비티를 화면에서 보고 이와 상호 작용할 수 있다.

- onStop() 이 호출되어 새 액티비티가 시작되면 이 액티비티는 더 이상 표시되지 않는다.

- 시스템은 액티비티의 전체 수명 내내 onStart() 및 onStop() 을 여러 번 호출할 수 있다.

- 이 때 액티비티는 사용자에게 표시되었다 숨겨지는 상태를 오가게 된다.

04. 액티비티가 foreground에서 동작하는 구간

- onResume() 에서 onPause() 호출 사이를 말한다.

- 사용자 입력도 여기에 집중된다.

- 액티비티는 전경에 나타났다 숨겨지는 전환을 자주 반복할 수 있다.

🧩 기기가 절전모드에 들어가거나 대화상자가 나타나면 onPause() 가 호출된다.

05. 수명주기 콜백 메소드

  • 액티비티가 생성되고 해제될 때까지 액티비티의 상태에 따라서 불려지는 메소드를 라이프 사이클 콜백 메소드라 부른다.

  • 모든 라이프 사이클에는 콜백 메소드가 있다.

  • 필요한 경우에 해당 콜백 메소드를 재 정의할 수 있다.

1) 주요 콜백 메소드

  • onCreate() : 반드시 구현해야 하는 메소드로서 액티비티가 생성되면서 호출됨
- 가장 중요한 작업은 화면을 setContentView()를 호출하여 설정하는 것
  • onPause() : 사용자가 액티비티를 떠나고 있을 때 호출됨
- 액티비티가 완전히 소멸되는 것은 아니지만 사용자가 돌아오지 않을 수 있기 때문에 그 동안 이루어졌던 변경사항을 저장

06. 액티비티 전환 시 수명주기 콜백 메소드 호출 순서

🧩 FirstActivity에서 SecondActivity 시작

    1) FirstActivity의 onPause()

    2) SecondActivity의 onCreate() -> onStart() -> onResume()

    3) FirstActivity의 onStop()



🧩 단말기의 뒤로가기 버튼 클릭

    1) SecondActivity의 onPause()

    2) FirstActivity의 onRestart() -> onStart() -> onResume()

    3) SecondActivity의 onStop() -> onDestroy()

콜백 메소드 구현


  • Android Studio에서 수명주기 콜백 메소드를 쉽게 생성하는 방법
1. 수명주기 콜백 메소드를 생성하고자 하는 클래스(MainActivity 등) 의 소스 코드를 연다.

2. 메소드를 생성하고자 하는 소스 코드의 위치에 커서를 찍고, 우클릭 -> Generate 클릭

3. Override Methods... 클릭 -> 생성하고자 하는 메소드를 선택한 후 OK
  • 콜백 메소드 안에 로그를 출력하는 코드를 삽입
val TAG = "MainActivity_Lifecycle"

Log.i(TAG, "log message")
profile
응애 나 아기 뉴비

0개의 댓글