안녕하세요 이번에는 Android 12부터 변경된 Splash Screen을 적용하는 방법에 대해 알아보겠습니다.
Android12 이전까지는 개별적으로 제작사에서 SplashScreen을 만들어서 사용했었습니다. 기존에 이런 방식은 내가 원하는 UI를 제작할 수 있어서 좋았지만 Android의 앱 실행 상태에 맞지 않는 문제가 있었습니다.
앱 실행 상태 3가지 종류가 있습니다.
cold-start : 프로세스가 램에 존재하지 않는 상태, 즉 새롭게 실행하는 상태
warm-start : 앱은 종료되었지만 프로세스가 램에 아직 남아있는 상태에서 실행
hot-start : 앱과 프로세스가 아직 남아있는 상태에서 실행
이 3가지 상태에서 hot-start는 앱의 모든 활동이 아직 메모리에 남아 있기 때문에 새롭게 리소스를 불러올 필요가 없습니다. 하지만 개별적으로 Splash를 만든 앱에서는 hot-start상태에서도 새롭게 리소스를 다시 불러오게 된다는 문제가 있습니다. 그래서 Google에서는 Android12부터 SplashScreen을 자체적으로 지원하기 시작하였습니다.
그러면 기존의 앱 실행 화면과 Android12에서의 새로운 화면을 비교해 보도록 하겠습니다.
Android 12+ Splash Screen , Android 11- Splash Screen 비교
오늘의집 앱을 실행했을 때 Android 12의 경우에는 아이콘이 한번 나타난 후 기존 스플래시 화면이 나타나는 것을 볼 수 있습니다. 반면 Android 9에서 실행했을 때는 앱의 기존 스플래시만 나타난 후 다음 화면으로 넘어가게 됩니다.
Android 12에서 SplashScreen을 설정하는 방법은 크게 3가지가 있습니다.
1. Android12 SplashScreen 기능 사용하기
2. SplashScreen Api 사용하기
3. Android12의 SplashScreen의 아이콘을 투명화하고 기존 Splash 보여주기
1번 방법과 2번 방법의 차이는 Android12에서만 적용되는 것과 기존 버전들과 함께 적용되는 것의 차이입니다.
3번의 경우에는 권장하지는 않지만 ' 나는 좀 화려한 Splash를 제작하고 싶어' 하면 3번의 방법을 사용할 수 있습니다.
1번 방법, 3번 방법은 간략하게만 알아보고 2번 방법의 사용법에 대해 알아보도록 하겠습니다.
Android 12 SplashScreen 기능
먼저 SplashScreens의 Theme 속성을 알아보겠습니다.
- Android 12 SplashScreen 기능의 속성
<!-- Splash 화면의 백그라운드 컬러 지정 -->
<item name="android:windowSplashScreenBackground">@color/color</item>
<!-- Splash 화면의 중앙에 위치할 아이콘 Drawable 지정 -->
<item name="android:windowSplashScreenAnimatedIcon">@drawable/icon</item>
<!-- Splash 화면 중앙의 아이콘 주변 Background Color 지정 -->
<item name="android:windowSplashScreenIconBackgroundColor">@color/color</item>
<!-- Splash 화면이 나타나는 시간 지정 -->
<item name="android:windowSplashScreenAnimationDuration">duration_int</item>
<!-- Splash 화면 하단에 나타낼 브랜딩이미지 지정 (비권장) -->
<item name="android:windowSplashScreenBrandingImage">@drawable/branding_image</item>
이제 themes.xml에 사용하는 방법을 알아보겠습니다.
- themes.xml
<resources xmlns:tools="http://schemas.android.com/tools">
<style name="Theme.SplashEx" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
....
<item name="android:windowSplashScreenBackground" tools:targetApi="S">@color/color</item>
<item name="android:windowSplashScreenAnimatedIcon" tools:targetApi="S">@drawable/icon</item>
<item name="android:windowSplashScreenIconBackgroundColor" tools:targetApi="S">@color/color</item>
<item name="android:windowSplashScreenAnimationDuration" tools:targetApi="S">duration_int</item>
<item name="android:windowSplashScreenBrandingImage" tools:targetApi="S">@drawable/branding_image</item>
</style>
</resources>
위와 같이 기존 테마 안에 targetApi를 S로 설정하여 사용할 수 있습니다. 혹은 themes.xml(v31)을 별도로 생성하여 사용할 수도 있습니다.
기존 Splash 사용하기
3번 방법은 간단합니다. 스플래시 화면에서 나타나는 아이콘을 투명화하여 Splash가 존재하지 않는 것처럼 나타낸 후 기존 Splash 화면을 보여주는 것입니다.
<resources xmlns:tools="http://schemas.android.com/tools">
<style name="Theme.SplashEx" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
....
<item name="android:windowSplashScreenAnimatedIcon" tools:targetApi="S">@android:color/transparent</item>
</style>
</resources>
SplashScreen Api 사용하기 예제
SplashScreen Api는 Android12 뿐만 아니라 그 이하의 버전에서도 동일한 Splash를 적용시켜주는 Api입니다. 그러면 예제를 통해 사용방법을 알아보도록 하겠습니다.
- build.gradle(Module: app)
dependencies {
...
//splashscreen api
implementation 'androidx.core:core-splashscreen:1.0.0-rc01'
}
먼저 build.gradle app단에서 splashscreen 의존성을 추가해주고 Sync Now를 눌러줍니다.
- themes.xml
<style name="Theme.App.Starting" parent="Theme.SplashScreen">
<item name="windowSplashScreenBackground">@color/purple_200</item>
<item name="windowSplashScreenAnimatedIcon">@drawable/ic_jd</item>
<item name="postSplashScreenTheme">@style/Theme.SplashEx</item>
</style>
themes.xml에서 새로운 style을 생성합니다. 이 때 style의 이름은 Thme.App.Starting이여야 합니다.
위에서 사용하였던 속성과 SplashScreen Api의 속성은 유사합니다. 다른 점은 api는 windowSplashScreenBrandingImage를 사용할 수 없고 postSplashScreenTheme이 추가되었습니다.
postSplashScreenTheme은 Splash가 끝난 후 사용될 Theme을 지정해주는 것입니다. 내 App의 기본 Theme으로 연결시켜 줍니다.
- AndroidManifest.xml
<application
...
android:theme="@style/Theme.SplashEx">
<activity
android:name=".MainActivity"
android:exported="true"
android:theme="@style/Theme.App.Starting">
<intent-filter>
...
</intent-filter>
</activity>
</application>
application의 theme에는 기본 Theme을 지정해주고 MainActivity의 theme에는 아까 만든 Theme.App.Starting을 지정해줍니다. 사용법에는 application단이나 activity단에 사용해도 된다고 적혀있었는데 그렇게 적용하니까 cold, warm start가 아닐 경우에는 문제가 생겼습니다. 그렇기 때문에 제가 사용한 방법을 사용하는 것을 추천드립니다.
- MainActivity.kt
class MainActivity : AppCompatActivity() {
private lateinit var splashScreen: SplashScreen
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// setContentView하기 전에 installSplashScreen() 필수
splashScreen = installSplashScreen()
startSplash()
setContentView(R.layout.activity_main)
}
// splash의 애니메이션 설정
private fun startSplash() {
splashScreen.setOnExitAnimationListener { splashScreenView ->
val scaleX = PropertyValuesHolder.ofFloat(View.SCALE_X, 1f, 5f, 1f)
val scaleY = PropertyValuesHolder.ofFloat(View.SCALE_Y, 1f, 5f, 1f)
ObjectAnimator.ofPropertyValuesHolder(splashScreenView.iconView, scaleX, scaleY).run {
interpolator = AnticipateInterpolator()
duration = 1000L
doOnEnd {
splashScreenView.remove()
}
start()
}
}
}
}
기본 Splash만 사용하시려면 setContentView 이전에 installSplashScreen()만 실행시켜 주면 됩니다.
startSplash는 애니메이션을 구현하는 부분입니다. 스플래시화면의 아이콘을 1초 동안 확대했다가 줄어들도록 구현하였습니다. 결과를 확인해 보겠습니다.
안드로이드 9, 12에 공통적으로 적용된 Splash를 보실 수 있습니다.
예제는 아래의 제 Github에서 받아보실 수 있습니다.
이번에는 SplashScreen에 대해 알아보았습니다. 이해가 되지 않거나 다른 궁금한 점, 잘못된 점이 있다면 댓글을 남겨주세요!
'Android > Libraries' 카테고리의 다른 글
[Android] 안드로이드 Permission(권한) 예제 - 연락처/주소록 만들기 (권한 획득, 연락처 불러오기) (0) | 2022.07.24 |
---|---|
[Android] Parcelable 생성 Parcelize로 편하게 생성하기(with Serializable) (0) | 2022.07.24 |
[Android] 안드로이드 Permission(권한) 종류 및 권한 획득 예제(지문인증 / 생체 인증) (0) | 2022.07.11 |
[Android] Glide를 사용하여 ImageView에 사진 불러오기 (0) | 2022.07.03 |
[Android] Kakao(카카오) SDK를 이용하여 로그인 구현하기 - 로그인 (0) | 2022.05.27 |