나만의 개발노트

[안드로이드] 액티비티(Activity), 인텐트(Intent) - 화면전환 본문

[안드로이드]/[안드로이드] 공부 기록

[안드로이드] 액티비티(Activity), 인텐트(Intent) - 화면전환

노트포미 2023. 10. 7. 02:50

애플리케이션 구성 요소

- 시스템에서 관리함

- AndroidManifest.xml에 구성요소를 넣어두면, 앱이 설치될 때 시스템이 이 파일로 구성요소를 확인함

  -> 구성요소를 추가하면 반드시 매니페스트 파일에 그 정보를 넣어야 함

액티비티 (Activity)

: 화면

 

서비스 (Service)

 

브로드캐스트 수신자(Broadcast Receiver)

 

컨텐트 프로바이더(Content Provider)

 

 

 

액티비티 전환하기

1. File -> New -> Activity 로 새로운 액티비티 만들기

*AndroidManifest.xml에 <Activity>로 자동 추가됨

 만약 수동으로 java, xml 만든 경우, 반드시 AndroidManifest.xml에 추가해줄 것

#AndroidManifest.xml

<activity
            android:name=".MainActivity2"
            android:exported="false" />
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

 

2. (액티비티1) Intent 객체 만들기

- intent : 액티비티를 관리하는 시스템에 원하는 행동을 요청하는 포맷

Intent intent = new Intent(getApplicationContext(), MainActivity2.class);

 

3. (액티비티1) startActivity() / startActivityForResult()로 원하는 화면 전달하기

1) 그냥 화면 실행

startActivity(intent);

  2) 데이터를 받는 경우

   - 요청코드 : 정보를 보내는 화면을 구분하기 위한 코드

   - startActivityForResult(intent, 요청코드);

startActivityForResult(intent, 101);

   

4. 액티비티1로 돌아오기 (액티비티2에 작성)

1) 그냥 화면 실행

   - 액티비티는 stack(선입후출)의 형태로 아래에 쌓임 ->  finsh() 하면 이전 액티비티가 보임

finish();

2) 데이터 전달하기

  1. Intent 객체 생성 -> intent.putExtra("키값","데이터"); -> setResult(intent); 

  2. 응답이 정상적인 응답인지 구분하기 위해 Activity.RESULT_OK 또는 RESULT_CANCELED

  3. MainActivity에서 응답받을 메서드 정의

Intent intent = new Intent();
intent.putExtra("name","예시");

setResult(Activity.RESULT_OK,intent);
finish();

 

#MainActivity2.java 전체코드

package com.example.pracactivity;

import androidx.appcompat.app.AppCompatActivity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

public class MainActivity2 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        Intent intent = new Intent();
        intent.putExtra("name","예시");

        setResult(Activity.RESULT_OK,intent);
        finish();
    }
}

 

5. 전달한 데이터 받기

   3. 액티비티1에서 응답받을 메서드 정의

      : 우클릭 -> Generate -> Override Methods -> onActivityResult() 

       *'on' : 콜백함수

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
}

-> requestCode : 액티비티1에서 데이터 전달한 화면을 구분하기 위해 보낸 문자 ex) 101

     resultCode : 응답구분하는 상수(setResult()의 두번째 인자) ex)Activity.RESULT_OK

     data : 전달받은 intent

 

6. 데이터(intent) 사용

- 데이터가 문자열인 경우, data.getStringExtra("키값",)

//액티비티2에서 보낸 intent중 name값이 "name"인 데이터 받기
String name = data.getStringExtra("name");

#최종 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/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="액티비티2로 바꾸기"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="액티비티1"
        android:textSize="30dp"
        app:layout_constraintBottom_toTopOf="@+id/button"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

#최종 MainActivity.java

package com.example.pracactivity;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //'액티비티2로 바꾸기' 버튼 누르면 액티비티2 실행
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //1. Intent 객체 만들기
                Intent intent = new Intent(getApplicationContext(), MainActivity2.class);
                //2. 데이터 전달받기 위한 메소드 (requsetCode : 101)
                startActivityForResult(intent, 101);
            }
        });


    }

    //7.전달받은 데이터 확인 메소드
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(requestCode == 101){ //액티비티2에서 보낸 데이터인지 확인
            //액티비티2에서 보낸 intent중 name값이 "name"인 데이터 받기
            String name = data.getStringExtra("name");
            Toast.makeText(this, name, Toast.LENGTH_SHORT).show();
        }
    }
}

#최종 activity_main2.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/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="액티비티2로 바꾸기"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="액티비티1"
        android:textSize="30dp"
        app:layout_constraintBottom_toTopOf="@+id/button"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

#최종 MainActivity2.java

package com.example.pracactivity;

import androidx.appcompat.app.AppCompatActivity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity2 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //3. 데이터 전달하기 위한 intent 생성
                Intent intent = new Intent();
                //4. putExtra로 데이터 전달 (name: "name", value: "예시")
                intent.putExtra("name","전달된 데이터 예시");

                //5. 데이터 전송 메소드 (Activity.RESULT_OK: resultCode)
                setResult(Activity.RESULT_OK,intent);
                //6. 이전 화면(액티비티1)으로 돌아가기
                finish();
            }
        });


    }
}

#실행화면

처음 액티비티1
액티비티2 실행화면
액티비티1로 돌아오면서 전달된 데이터 확인


출처 : https://www.boostcourse.org/mo316/lecture/259016?isDesc=false 

 

안드로이드 앱 프로그래밍

부스트코스 무료 강의

www.boostcourse.org