TIL. 코틀린 액티비티, 컨텍스트, 인텐트

Devback·2021년 1월 7일
0

Kotlin

목록 보기
6/8

액티비티 (Activity) 😀

액티비티는 사용자가 직접 보고 입력하는화면을 담당하는 컴포넌트이다. 즉, 우리가 생각하는 UI화면을 생각하면 쉽다.

메이저 컴포넌트 중에 하나인 액티비티를 다루기 위해서는 먼저 컴포넌트를 구성하고 있는 핵심 요소인 컨텍스트에 대한 이해가 필요하다.

컨텍스트💻

액티비티, 서비스 등의 컴포넌트와 스피너, 리사이클러뷰와 같은 화면 요소를 사용하기 위해서는 컨텍스트가 필요하다.

컨텍스트는 시스템을 사용하기 위한 정보(프로퍼티)와 도구(메서드)가 담겨있는 클래스이다.
대부분의 컨텍스트는 컴포넌트 실행(Runtime)시 함께 생성되고, 생성된 컴포넌트가 가지고 있는 메서드를 호출해서 각각의 도구들을 사용할 수 있다.

컨텍스트의 종류 🐹

컨텍스트는 어플리케이션 컨텍스트와 베이스 컨텍스트가 있다.

  1. 어플리케이션 컨텍스트
    어플리케이션과 관련된 핵심 기능을 담고 있는 클래스이다. 앱을 통틀어서 하나의 인스턴스만 생성된다.

  2. 베이스 컨텍스트
    안드로이드의 4대 메이저 컴포넌트인 액티비티, 서비스, 컨텐트 프로바이더, 브로드캐스트 리버서 클래스이다.

인텐트(intent) ☺️

인텐트(intent)란 안드로이드 4대 컴포넌트가 서로 데이터를 주고받기 위한 메시지 객체이다.

명시적 인텐트 : 액티비티 이름을 명확하게 지정할 때 사용하는 방법
암시적 인텐트 : 약속된 액션을 지정하여 안드로이드에서 제공하는 기종의 응용 프로그램을 실행하는 것

메인 액티비티에서 서브 액티비티 실행하기

액티비티 메서드를 사용하면 메인 액티비티에서 다른 액티비티를 실행할 수 있다.


class MainActivity : AppCompatActivity() {


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

		
        // 변수 intent에 MainActivity2를 Intent()메소드로 intent를 생성
        val intent = Intent(this, MainActivity2::class.java)
        intent.putExtra("from1", "hello bundle")
        intent.putExtra("from2", 2020)


        val  buttonView = findViewById<Button>(R.id.buttonView)
        buttonView.setOnClickListener{
        // 액티비티 시작하는 매서드
            startActivity(intent)
        }
    }


}

액티비티 사이에 값 주고받기 ✅

intent의 putextra 메서드를 이용하면 액티비티 사이에 값을 주고 받을 수 있다.

	/*MainActivity*/
    val intent = Intent(this, MainActivity2::class.java)
    intent.putExtra("from1", "hello bundle")
    intent.putExtra("from2", 2020)
    
    
   /*MainActivity2*/
    val to1 = findViewById<TextView>(R.id.to1)
    val to2 = findViewById<TextView>(R.id.to2)
      

    to1.text = intent.getStringExtra("from1")
    to2.text = "${intent.getIntExtra("from2", 0)}"
    to1.text = intent.getStringExtra("from1")
    to2.text = "${intent.getIntExtra("from2", 0)}"

    to1.text = intent.getStringExtra("from1")
    to2.text = "${intent.getIntExtra("from2", 0}"

메인 액티비티에서 값 돌려받기 ⮐

위에서는 메인 액티비티에서 서브 액티비티로 값을 돌려주기만 했는데 받은 값을 돌려줄 수도 있다.

   /*MainActivity2*/


import android.app.Activity
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView

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


            val to1 = findViewById<TextView>(R.id.to1)
            val to2 = findViewById<TextView>(R.id.to2)
            val exitButton = findViewById<Button>(R.id.ExitButton)

            to1.text = intent.getStringExtra("from1")
            to2.text = "${intent.getIntExtra("from2", 0)}"

            to1.text = intent.getStringExtra("from1")
            to2.text = "${intent.getIntExtra("from2", 0)}"

        exitButton.setOnClickListener{
            // 인텐트를 만든다.
            val returnIntent = Intent()
            // 인텐트에 값을 넣어준다.
            returnIntent.putExtra("returnValue", exitButton.text.toString())
            
            
            //returnIntent와 상태 값을 setResult() 메서드에 담아서 실행하면 호출한 측으로 전달 된다. 상태 값은 RESULT_OK와 RESULT_CANCELED로 안드로이드에 이미 상수로 정의되어 있다. 
   
            setResult(Activity.RESULT_OK, returnIntent)
            // finish 메서드를 호출해서 최종적으로 값을 전달한다.
            finish()
            
        }
    }
}

	/*MainActivity*/
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.widget.Button
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Retrofit

import retrofit2.create
import retrofit2.http.GET

class MainActivity : AppCompatActivity() {


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)


        val intent = Intent(this, MainActivity2::class.java)
        intent.putExtra("from1", "hello bundle")
        intent.putExtra("from2", 2020)


        val  buttonView = findViewById<Button>(R.id.buttonView)
        buttonView.setOnClickListener{
        // 두번째 인자로는 request코드가 들어간다. 
             startActivityForResult(intent, 99)
        }
    }
	
    // ctrl + o를 누르고 onActivityResult를 실행한다. 
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        if(resultCode == Activity.RESULT_OK) {
            when (requestCode) {
                99 -> {
                    val message = data?.getStringExtra("returnValue")
                    // Toast는 화면에 잠깐 나타났다 사라지는 메시지 출력 도구이다. 
                    // .show()를 호출해야지만 화면에 나타난다.
                    Toast.makeText(this, message, Toast.LENGTH_LONG).show()
                }
            }

        }
    }

}

onActivityResult()메서드의 구조
requestCode: 호출 시에 메인 액티비티에서 입력하는 코드 startActivityForResult 메서드에 인텐트와 함께 입력해서 호출한 코드(또는 버튼)를 구분한다.

resultCode: 결과 처리 후 서브 액티비티에서 입력하는 코드

data: 결과 처리 후 서브 액티비티가 넘겨주는 인텐트가 담겨 있다.

Toast.makeText의 파라미터

  • 첫 번째 파라미터: 화면을 위한 기본 도구인 컨텍스트가 필요한데, 액티비티가 이미 가지고 있다. this라고 입력하면 된다.
  • 두 번째 파라미터: 출력 될 메시지를 문자열로 전달한다.
  • 세 번째 파라미터: 메시지가 얼마 동안 출력될지를 결정한다.

액티비티 생명주기

출처: https://bit.ly/35jZHbP

안드로이드는 앱이 실행된 후 다른 액티비티 화면으로 전환되거나, 스마트폰 화면이 꺼지거나 혹은 앱이 종료될 때와 같이 상태 변화가 있을 때마다 화면에 보여지는 액티비티의 생명 주기 메서드를 호출해서 상태 변화를 알려준다.

profile
나랑 같이 개발할 사람🖐

0개의 댓글