와챠의 우당탕탕 코딩 일기장

[Android/Kotlin]Udemy 강의 정리: #5 UI 구성: 화면 이동 설계(Activity/Fragment 생명주기, Splash) 본문

코딩 일기장/Android(Kotlin)

[Android/Kotlin]Udemy 강의 정리: #5 UI 구성: 화면 이동 설계(Activity/Fragment 생명주기, Splash)

minWachya 2022. 6. 10. 15:53
반응형

목차

  1. Manifest에 대해서
    1. allowBackup
    2. icon / label / roundIcon
    3. mipmap
    4. supportsRtl
    5. exported
    6. intenr-filter
  2. Splash
    1. api 30 이하 버전의 Splash
    2. api 31 이상 버전의 Splash
  3. Fragment Manager
    1. 액티비티 내에 프레그먼트를 추가할 수 있는 영역 만들기
    2. 프레그먼트 호출법
  4. Activity 생명주기
  5. Fragment 생명주기
  6. 기타 배운 것들

1. Manifest에 대해서

Manifest 내용

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.shoppi">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Shoppi">
        <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>
    </application>

</manifest>

<application> 태그 안


1-1. allowBackup
사용자 데이터를 구글 드라이브에 25메가바이트까지 자동으로 백업/복원 여부

android:allowBackup="true"



1-2. icon / label / roundIcon

기본 아이콘 / 앱이름 / 원형 아이콘

android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"

 

1-3. mipmap

: mipmap폴더에는 app icon res만 추가해야 함
여러 해상도에 대응하기 위함

 

1-4. supportsRtl
LtR: 왼쪽에서 오른쪽으로 읽는 것, ex: 한국어, 영어...

RtL: 오른쪽부터 왼쪽으로 읽는 것

supportsRtl: RtL 지원 활성화 여부: true | false

android:supportsRtl="true"


<activity> 태그 안

1-5. exported
다른 구성 요소로 이 Activity 실행할 수 있는지 여부

android:exported="true"


1-6. intenr-filter
메인 액티비티를 런처 액티비티로 사용하겠다

<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. Splash

api 31버전(S)부터 sdk 내부에서 스플래시 스크린 제공해줌
api 30 이하와 31 이상의 동작이 달라짐


2-1. api 30이하의 Splash Screen 만드는 법:

1. drawable > background_splah_screen.xml 생성

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <gradient
                android:angle="315"
                android:endColor="@color/shoppi_gradient_purple"
                android:startColor="@color/shoppi_gradient_pink"
                android:type="linear" />
        </shape>
    </item>

    <item>
        <bitmap
            android:gravity="center"
            android:src="@drawable/img_logo" />
    </item>

</layer-list>

 

2. theme에 아래 스타일 추가(기존 Theme을 확장함)

<style name="Theme.Shoppi.Splash">
    <item name="android:windowBackground">@drawable/background_splah_screen</item>
</style>

 

3. SplashActivity 생성

package com.example.shoppi

import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity

class SplashActivity:AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        startActivity(Intent(this@SplashActivity, MainActivity::class.java))
        finish()
    }
}

 

4. Manifest에서 SplashActivity 먼저 실행되게 + SplashTheme 적용되게 변경

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.shoppi">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Shoppi">
        <activity
            android:name=".SplashActivity"
            android:exported="true"
            android:theme="@style/Theme.Shoppi.Splash">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

        <activity
            android:name=".MainActivity"
            android:exported="false" />

    </application>

</manifest>

2-1. api 31 이상의 Splash Screen 만드는 법:

android project의 리소스 파일은 버전별로 구분 가능함.

ex) mipmap-anydip-v26 폴더: 26버전 이상에서 참조하는 파일

values 폴더도 버전별로 구분 가능함

 

1. values-v31 폴더 생성하기

res 오른쪽 클릭 > New > Androud Resource Directory

 

2. values-v31에 theme.xml 추가

여기서 Splash 내용 정의해주면 된다.

이때 Theme의 이름은 위에서 정의한 Theme  이름과 같아야 한다!!

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="Theme.Shoppi.Splash">
        <item name="android:windowSplashScreenBackground">@color/shoppi_white</item>
    </style>
</resources>

3. Fragment Manager: 

액티비티에 프레그먼트를 추가/삭제/교체하는 작업 함
프레그먼트는 단독으로 존재할 수 없음
호스트 액티비티에 추가할 수 있는, 액티비티의 구성요소임

3-1. 액티비티 내에 프레그먼트를 추가할 수 있는 영역 만들기

FragmentContainerView

name: 맨 처음 보여줄 프레그먼트 지정하는 속성

android:name="com.example.shoppi.HomeFragment"

전체코드:

<?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">

    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/container_main"
        android:name="com.example.shoppi.HomeFragment"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toTopOf="@id/navigation_main"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/navigation_main"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:menu="@menu/navigation_main" />

</androidx.constraintlayout.widget.ConstraintLayout>

3-2. 프레그먼트 호출법

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        val button = view.findViewById<Button>(R.id.btn_enter_product_detail)
        button.setOnClickListener {
            val transaction = parentFragmentManager.beginTransaction()
            transaction.add(R.id.container_main, ProductDetailFragment())
            transaction.commit()
        }

    }

4. Activity 생명주기

1. onCreate

  • 액티비티 생성되초 최초 한 번 호출되는 콜백
  • 최초 한 번만 해도 좋을 작업하기
  • ex) 레이아웃 인플레이트, 데이터 초기화

2. onStart

  • 액티비티가 화면 벗어났다가 되돌아왔을 때 호출될 수 있음
  • ex) 애니메이션 실행, 데이터 갱신

3. onResume

  • 액티비티가 화면에서 보여짐(액티비티가 포커스를 얻음)
  • 포커스를 얻었을 때 반드시 처리해야 하는 작업하기 

4. onPause

  • 포커스 잃었을 때 호출되는 콜백
  • onResume, onPause는 자주 호출될 수 있어서 오래 걸리는 연산 처리하면 안됨

5. onStop

  • onStart와 대응
  • 애니메니션 중지, 데이터 갱신 중지

6. onDestroy

  • 사용중인 앱 목록에서 완전히 제거될 때 호출
  • onStop에서 정리하지 못한 작업이 있다면 리소스 해제 작업하기

5. Fragment 생명주기

프레그먼트는 액티비티에서 인플레이트 시키는 것이므로
액티비티의 상태에 따라 프레그먼트의 상태도 변함

1. onCreate

  • 액티비티의 onCreate: 레이아웃 인플레이트
  • but, 프레그먼트의 onCreate에서는 레이아웃 인플레이트 X
    (프레그먼트는 액티비티에서 인플레이트 하기 때문에 액티비티가 먼저 인플레이트 되어야 하기 때문)
  • onCreateView에서 생성된 View를 가지고 onViewCreated에서 View 참조 얻을 수 있음

2. onViewStateRestored

  • 화면 소멸 뒤 다시 재생성될 때 이전 저장했던 데이터 기반으로 View 복원할 때 불리는 콜백
  • 프레그먼트 생명주기의 Create단계에서 호출되는 콜백들은 프레그먼트를 프레그먼트 매니저에 추가할 때 호출됨

3. onSaveInstanceState

  • 화면소멸 전에 복원에 필요한 데이터 저장하는 단계

4. onDestroyView

  • onCreateView와 대응
  • 화면 소멸 직전에 리소스 해제하지 못한 거 정리

5. onStart, onResume, onPause, onStop, onDestroy은 Activity 생명주기와 동일

 


6. 기타 배운 것들

AppCompatActivity()의 Compat의미:
이전 버전과 호환성 지원

Layout inflate:
레이아웃을 띄움==
setContentView()의 인자로 레이아웃 id 전달하고, 이 레이아웃 내부에 구현되어 있는 것을 위젯으로 변경하는 과정==
View 하이어락키 정보(View의 위계관계, 트리구조)를 실제로 위젯을 인스턴스화시켜 화면에 그리는 것

어떠한 이벤트들을 알려 주는 메서드(콜백)는 이름 앞에 on 붙음
ex) onCreate, onStart, onResume


 

생명주기들 다시 봐서 좋았다.

봐도봐도 새로운 것 같은 생명주기^^ㅋㅋㅋ

버전별로 스플래시 다르게 만들어 주는 것,,

저번에 기본 Theme과 night Theme 도 챙겨주는 것처럼,,

하나만 하는 게 아니라 여러 버전들 생각해주는 것도 꼬옥 익혀야겠다 싶음

호환성!!! 귀찮다고 대충하지 말고 꼼꼼하게 생각하기

 

그리고... 새 파일 만들기 딘축키 : alt + insert

반응형
Comments