본문 바로가기
TIL/Android

[Android] 액티비티(Activity) 간의 통신 / 인텐트(Intent)로 데이터 주고 받기 / 액티비티 추가 생성하기

by 왁왁s 2022. 11. 11.

 Activity - Activity 간의 이동

 

1. Activity 추가 생성하기

빈 액티비티를 생성해준다.

New -> Activity -> Empty Activity

New -> Kotlin Class/File 을 해도 된다.

Activity의 이름은 원하는 것 아무거나 설정해준다.

 

LayoutName은 자동으로 생성되며,

Lancher Activity를 체크하게 되면 안드로이드 설정 파일 AndroidManifest.xml에 런처로 등록되어 프로그램 실행 시에 가장 먼저 호출되도록 설정이 된다.

 

MainActivity와 함께 2개가 런쳐 액티비티로 설정이 될 경우 원하지 않은 액티비티가 실행될 수 있어 추가적인 수정이 필요하다.

 

 

 


 

2.  추가로 생성한 Activity에도 ViewBinding 적용

ViewBinding은 아래의 글을 참고하도록 하자.

뷰 바인딩 설정 및 사용 방법

 

[Android] 뷰 바인딩(ViewBinding)이란? / 뷰 바인딩 설정 및 사용 방법 / ViewBinding findViewById 차이점

Activity와 Layout을 결합하는 대표적인 방법 1. findViewById - Android 초기부터 사용되었으며 별다른 설정없이 사용 가능하다. - 안드로이드 리소스를 관리하는 R 클래스를 통해 View를 찾는다. - 자동으로

parkjh7764.tistory.com

 

이전과 다르게 viewBinding을 생성한 Activity의 이름에 따라 ActivityMoveBinding을 해주었다.

위에서 var로 선언한 클래스명과 아래에서 할당할 때 쓰는 클래스명을 동일하게 써줘야 에러가 나지 않는다.

package com.til.binding_ex

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.til.binding_ex.databinding.ActivityMainBinding
import com.til.binding_ex.databinding.ActivityMoveBinding

class MoveActivity : AppCompatActivity() {
    private lateinit var viewBinding: ActivityMoveBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        viewBinding = ActivityMoveBinding.inflate(layoutInflater)
        
        setContentView(viewBinding.root)
    }
}

 


 

3.  manifests(매니페스트) 추가로 생성한 액티비티(Activity) 작성

추가적으로 생성한 액티비티(Activity)를 AndroidManifest.xml 파일에 작성을 해주어야 한다.

보통은 자동적으로 작성이 되어 있지만, 매니페스트에 작성되지 않는 경우에 오류가 발생할 수 있으니

매니페스트에 작성해야 함을 알아두도록 하자.

 

나는 MoveActivity를 생성하였으므로, .MoveActivitiy가 작성되었다.

 


 

 

액티비티 사이의 이동을 위해선 intent 객체를 생성해야 한다.

 

인텐트와 관련된 더욱 자세한 것은 아래의 게시글을 참고하도록 하자.

 

인텐트(intent)란?

 

[Android] 인텐트(intent)란? / 컨텍스트(Context) /명시적 인텐트, 암시적 인텐트, 인텐트 필터

인텐트(Intent) 란? Intent는 메시징 객체로, 다른 앱 구성 요소로부터 작업을 요청하는 데 사용할 수 있다. 인텐트가 구성 요소 사이의 통신을 촉진하는 데는 여러 가지 방식이 있지만 기본적으로 3

parkjh7764.tistory.com

 


 

4. 명시적 인텐트(intent) 사용하기

추가적으로 생성한 Activity를 띄우기 위해 명시적 Intent를 사용한다.

 

Intent(Context, Class) 

val intent = Intent(this, MoveActivity::class.java);
startActivity(intent);

finish()

현재 ActivityContext에 넣고, 새로 띄울 ActivityClass에 넣는다.

 

인텐트(Intent)를 사용해 액티비티 전환 간의 액티비티를 종료하지 않으면 뒤로 가기를 수십 번 눌러야 하는 경우가 발생한다. 이를 방지하기 위해 적절하게 액티비티를 종료하는 명령어를 작성해줘야 한다.

finish()

 

 


 

5. 인텐트(Intent)로 액티비티 간의 데이터 주고 받기 / putExtra, getExtra

 

인텐트로 데이터 주기

 

인텐트(Intent)는 데이터를 담아 보내는 기능을 하며 액티비티 간의 인수와 리턴 값을 전달하는 데이터 전달 도구로 사용된다.

 

이때 주로 Bundle 타입Extra를 활용한다. 이름과 값의 쌍으로 된 임의 타입의 정보를 원하는 개수만큼 저장해 넘긴다.

Extra는 쉽게 말하면 인텐트 내의 '정보 저장 공간'이며 호출하는 쪽이나 받는 쪽에서 자유로운 엑세스가 가능하다.

 

인텐트에 값을 입력할 때는 키와 값의 조합으로 번들에 직접 넣고, 꺼낼 때는 입력했던 키 값을 사용해 데이터를 꺼낸다.


 

액티비티(Activity)를 이동하면서 이전의 x액티비티에서의 데이터를 함께 넘기고 싶다면, Intent 안에 있는 putExtra 함수를 사용한다.

 

아래는 Extras에 값을 저장하는 메서드 중 일부로, 거의 모든 타입에 대해 오버로딩이 되어 있어 다양한 데이터를 저장할 수 있다. 심지어 시리얼 라이징 가능한 객체도 저장이 가능하다.

indent.putExtra (String name, int value)

indent.putExtra (String name, String value)

indent.putExtra (String name, boolean value)

//name이 key 값에 해당하고, value가 전달하고자 하는 값이다.

putExtra는 Key 값과 Value 값으로 다양한 Value를 넘길 수 있다.

 

But, 크기가 너무 큰 데이터는 어렵다. 직접 만든 객체(Serializable, Parcelable)는 객체 직렬화 설정을 해야 담을 수 있다.


 

인텐트로 데이터 받기

위에서 언급한 Extras는 입력 뿐만 아니라 액티비티의 리턴 값을 받을 때도 사용한다. putExtra 의 'name'으로 값을 넣어두면 name 값에서 리턴 값을 꺼내 사용할 수 있다. 

 

아래의 defalutValue는 설정을 해두면, 만약 리턴 값을 받지 못 해 값이 전달되지 못 한 경우 설정한 디폴트 값으 리턴이 된다. 문자열의 경우엔 null 값이 리턴된다.

int getIntExtra (String name, int defaultValue)

String getStringExtra(String name)

boolean getBooleanExtra (String name, boolean defaultValue)

//name에 보관되어 있는 Int or String or Boolean 타입의 데이터를 가져온다.

 

 


6. 추가로 생성한 Acticity와 MainActivity 사이의 데이터 주고 받기

 

실행했을 때 화면

 

 

MainActivity.kt

package com.til.binding_ex

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.til.binding_ex.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
    private lateinit var viewBinding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        setTitle("Activity 간의 데이터 통신")

        viewBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(viewBinding.root)

        viewBinding.btnNext.setOnClickListener {
            val intent = Intent(this, MoveActivity::class.java)

            intent.putExtra("key", "이전 액티비티로 넘어온 값")
            startActivity(intent)
            finish()
        }
    }
}

 

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/btn_next"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="데이터 받아오기"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

 


새로 생성한 액티비티

MoveActivity.kt

package com.til.binding_ex

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.til.binding_ex.databinding.ActivityMainBinding
import com.til.binding_ex.databinding.ActivityMoveBinding

class MoveActivity : AppCompatActivity() {
    private lateinit var viewBinding: ActivityMoveBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_move)
        setTitle("Activity 간의 데이터 통신")

        viewBinding = ActivityMoveBinding.inflate(layoutInflater)

        setContentView(viewBinding.root)

        val data = intent.getStringExtra("key")

        viewBinding.tvTextView.setText(data);
    }
}

 

activity_move.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=".MoveActivity">

    <TextView
        android:id="@+id/tvTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textSize="30sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

댓글