TOP
본문 바로가기
[Java]/Java Android

[Android] 인텐트 (Intent) 2 - 명시적 인텐트 예제

by 기록자_Recordian 2025. 4. 30.
728x90
반응형
이전 내용
 

[Android] 인텐트(Intent) - 1: 명시적 인텐트

이전 내용 [Android] 위젯 - 평점 (RatingBar)이전 내용 [Android] 컴파운드 버튼 3 - 토글 버튼이전 내용 [Android] 컴파운드 버튼 2 - 라디오 버튼이전 내용 [Android] 컴파운드 버튼 1 - 체크 박스이전 내용 [Andr

puppy-foot-it.tistory.com


명시적 인텐트 예제
스플래시 화면 + 로그인

 

 Q. 로그인 화면을 생성하는 데, 스플래시 기능을 추가한다.

※ 스플래시 기능
애플리케이션을 실행할 때 사용자에게 보여지는 첫 화면으로, 앱의 로딩 시간을 숨기거나 브랜딩을 강화하는 역할을 한다. 보통 로고나 브랜드 이미지를 표시하고, 짧은 시간 동안 화면에 보여 진다.

 

[생성 및 작성 파일]

  • Activity(java): Login용, 메인용, 아이디비밀번호 확인용(second)
  • layout(xml): 메인, login용, 아이디비밀번호 확인용(second)
  • drawable 이미지: 안드로이드, 회사 로고
  • mainifests 폴더 내의 AndroidManifest.xml: </application> 위에 아래 코드 추가
<activity android:name=".LoginActivity"
        android:label="LoginActivity"/>
    <activity android:name=".SecondActivity" />

 

[activity_main.xml]

<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:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#00BCD4"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="105dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintHorizontal_bias="0.494"
        app:srcCompat="@drawable/img"/>

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="74dp"
        android:layout_marginEnd="16dp"
        android:text="Hello, Android!"
        android:textSize="60sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

[login.xml]

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <ImageView
        android:id="@+id/logoImageView"
        android:layout_width="225dp"
        android:layout_height="287dp"
        android:layout_gravity="center_horizontal"
        android:layout_marginBottom="16dp"
        android:src="@drawable/companylogo" />

    <EditText
        android:id="@+id/emailEditText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="이메일"
        android:inputType="textEmailAddress"
        android:layout_marginBottom="16dp" />

    <EditText
        android:id="@+id/pwEditText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="비밀번호"
        android:inputType="textPassword"
        android:layout_marginBottom="16dp" />

    <Button
        android:id="@+id/loginButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="로그인" />

    <TextView
        android:id="@+id/forgotPasswordTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="비밀번호를 잊으셨나요?"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="16dp" />

    <TextView
        android:id="@+id/registerTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="계정이 없으신가요? 회원가입"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="16dp" />

    <TextView
        android:id="@+id/loginStatus"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="16dp"
        android:text="로그인 진행 중"
        android:textColor="#FF5722"
        android:textSize="34sp"
        android:textStyle="bold|italic" />

</LinearLayout>

 

[activity_second.xml]

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/linearLayout"
    android:background="#FFEB3B">

    <TextView
        android:id="@+id/nnn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="94dp"
        android:text="로그인 정보"
        android:textSize="32sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/displayIdTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="44dp"
        android:layout_marginTop="263dp"
        android:text="아이디: "
        android:textSize="24sp"
        android:textStyle="bold|italic"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <TextView
        android:id="@+id/displayPasswordTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="44dp"
        android:layout_marginTop="36dp"
        android:text="비밀번호: "
        android:textSize="24sp"
        android:textStyle="bold|italic"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/displayIdTextView" />

    <TextView
        android:id="@+id/loginSuccess"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="132dp"
        android:layout_marginTop="124dp"
        android:text="로그인 인증 중 "
        android:textSize="24sp"
        android:textStyle="bold|italic"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/displayIdTextView" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="12dp"
        android:onClick="check"
        android:text="인증시도버튼"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/loginSuccess" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

[MainActivity.java]

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    private static final int SPLASH_TIMEOUT = 2000; // 스플래시 화면 노출 시간 (2초)

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

        // 일정 시간 후에 로그인 화면으로 이동
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent(MainActivity.this,
                        LoginActivity.class);
                startActivity(intent);
                finish(); // 스플래시 화면 종료
            }
        }, SPLASH_TIMEOUT);
    }
}

 

스플래시 화면 지속 시간 설정:

  • private static final int SPLASH_TIMEOUT = 2000; :스플래시 화면이 2초 동안 표시되도록 설정.

onCreate 메서드:

  • super.onCreate(savedInstanceState);와 setContentView(R.layout.activity_main);: 액티비티가 처음 생성될 때 호출되며, UI 레이아웃을 설정합니다.

Handler와 postDelayed:

  • new Handler().postDelayed(new Runnable() ~ SPLASH_TIMEOUT);:  새로운 스레드를 생성하여 2초 후에 실행될 코드를 정의.

화면 전환:

  • Intent intent = new Intent(MainActivity.this, LoginActivity.class);
  • startActivity(intent);: 2초가 경과한 후 LoginActivity로 화면 전환.
  • finish();: 현재 MainActivity를 종료하여 스플래시 화면이 더 이상 나타나지 않도록 한다.

[LoginActivity.java]

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

import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;

public class LoginActivity extends AppCompatActivity {
    private EditText emailEditText, passwordEditText;
    private TextView statusText;
    private Button loginButton;
    private ActivityResultLauncher<Intent> launcher;

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

        emailEditText = findViewById(R.id.emailEditText);
        passwordEditText = findViewById(R.id.pwEditText);
        loginButton = findViewById(R.id.loginButton);
        statusText = findViewById(R.id.loginStatus);

        // ActivityResultLauncher 초기화
        launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
                result -> {
                    // 액티비티 결과 코드가 RESULT_OK인지 확인 (성공적으로 완료)
                    if (result.getResultCode() == RESULT_OK) {
                        // 반환된 Intent 데이터 가져오기
                        Intent data = result.getData();
                        // Intent에서 "status"라는 키로 전달된 문자열을 가져와 statusText 뷰에 설정
                        if (data != null) {
                            statusText.setText(data.getStringExtra("status"));
                        }
                    }
                });

        // 버튼 클릭 리스너 설정
        loginButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 아이디와 비밀번호 입력값 가져오기
                String email = emailEditText.getText().toString();
                String password = passwordEditText.getText().toString();

                // 두 번째 화면으로 전환하면서 아이디와 비밀번호 데이터 전달
                Intent intent = new Intent(LoginActivity.this, SecondActivity.class);
                intent.putExtra("ID", email);
                intent.putExtra("Password", password);
                launcher.launch(intent);
            }
        });
    }
}

 

UI 요소 초기화:

  • EditText, TextView, Button 등 UI 요소 초기화.
  • emailEditText, passwordEditText, statusText, loginButton을 각각 레이아웃 파일에서 찾는다.

ActivityResultLauncher:

  • ActivityResultLauncher<Intent> launcher;: 새로운 액티비티의 결과를 처리하기 위한 객체 선언.
  • launcher = registerForActivityResult(...): 결과를 처리하는 람다 함수를 등록하여, 결과 코드가 RESULT_OK일 때 반환된 Intent 데이터에서 "status"로 지정된 문자열을 가져와 statusText에 설정.

버튼 클릭 리스너:

  • loginButton.setOnClickListener(...): 로그인 버튼 클릭 시 동작 정의. 사용자가 입력한 이메일과 비밀번호를 가져와 SecondActivity로 전달하는 Intent 생성.
  • intent.putExtra(...): 입력값을 Intent의 추가 데이터로 포함.
  • launcher.launch(intent);: 두 번째 액티비티를 시작.

[SecondActivity.java]

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;


import androidx.appcompat.app.AppCompatActivity;

public class SecondActivity extends AppCompatActivity {

    private TextView displayIdTextView, displayPasswordTextView, statusTextView;
    String id, password;

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

        displayIdTextView = findViewById(R.id.displayIdTextView);
        displayPasswordTextView = findViewById(R.id.displayPasswordTextView);
        statusTextView = findViewById(R.id.loginSuccess);

        // 인텐트에서 아이디와 비밀번호 데이터 가져오기
        Intent intent = getIntent();
        id = intent.getStringExtra("ID");
        password = intent.getStringExtra("Password");

        // 화면에 아이디와 비밀번호 출력
        displayIdTextView.setText("아이디: " + id);
        displayPasswordTextView.setText("비밀번호: " + password);
    }

    public void check(View e) {
        // 로그인 로직 (더미 데이터 사용)
        Intent intent = new Intent();
        if (isUserValid(id, password)) {
            // 인증 성공 시 메인 액티비티로 이동
            intent.putExtra("status", "로그인 성공!");
        } else {
            // 인증 실패 시 메시지 표시
            // 실제로는 실패 처리 및 메시지를 표시하는 방식 변경 필요
            intent.putExtra("status", "로그인 실패!");
        }
        setResult(RESULT_OK, intent);
        finish();
    }

    private boolean isUserValid(String username, String password) {
        // 실제로는 여기서 서버 또는 로컬 데이터베이스를 통해 인증 확인 필요
        // 더미 데이터를 사용하여 단순하게 인증 성공 여부 판단
        return username.equals("kim") && password.equals("1234");
    }
}

UI 요소 초기화:

  • TextView를 사용하여 사용자의 아이디와 비밀번호를 화면에 표시.
  • displayIdTextView, displayPasswordTextView, statusTextView를 각각 레이아웃 파일에서 초기화.

인텐트에서 데이터 가져오기:

  • Intent intent = getIntent();를 통해 이전 액티비티에서 전달한 데이터 수신.
  • id = intent.getStringExtra("ID");와 password = intent.getStringExtra("Password");를 통해 사용자의 아이디와 비밀번호를 가져옴.

데이터 출력:

  • displayIdTextView.setText(...)와 displayPasswordTextView.setText(...)를 통해 가져온 아이디와 비밀번호를 화면에 출력.

로그인 검증:

  • check(View e) 메서드: 로그인 버튼 클릭 시 호출되는 메서드로, 인증 결과에 따라 상태 메시지를 포함한 인텐트 설정.
  • isUserValid(String username, String password): 사용자 인증 로직을 담당하는 메서드로, 간단한 더미 데이터를 기반으로 인증 성공 여부 판단.

결과 반환 및 액티비티 종료:

  • setResult(RESULT_OK, intent);: 로그인 결과를 설정하여 이전 액티비티로 반환.
  • finish();: SecondActivity 종료.

다음 내용

 

[Android] 인텐트(Intent) - 3: 암시적 인텐트

이전 내용 [Android] 인텐트 (Intent) 2 - 명시적 인텐트 예제이전 내용 [Android] 인텐트(Intent) - 1: 명시적 인텐트이전 내용 [Android] 위젯 - 평점 (RatingBar)이전 내용 [Android] 컴파운드 버튼 3 - 토글 버튼이

puppy-foot-it.tistory.com

728x90
반응형