티스토리 뷰
앱 시작 상태
cold start
앱이 처음부터 시작.
앱의 프로세스를 만들지 않는다.
기기가 부팅되거나 시스템에서 앱이 종료되고 난 후 앱이 처음으로 시작되는 경우 등에서 발생한다.
다른 시작 상태보다 더 많은 작업을 실행해야 하므로 시작 시간이 길어질 수 있다.
warm start
프로세스가 존재하지만 메모리에 올라오지 않은 경우.
사용자가 앱을 종료한 다음 다시 시작하거나, 시스템이 메모리에서 앱을 제거한 다음 사용자가 앱을 다시 시작하는 경우 등에서 발생한다.
hot start
프로세스가 존재하고 메모리에 올라온 경우.
백그라운드에서 실행되고 있다가, 포그라운드로 올라온다.
스플래시 작동 방식
사용자가 스플래시를 직접 지정해주는 경우에는, 메모리에 이미 앱이 존재하는 hot start이어도 스플래시 화면을 보여주기 때문에 대기시간이 더 길어진다.
그래서 구글에서는 안드로이드 12 이상에서는 스플래시 화면을 강제로 보여주도록 Splash Screen API가 추가되었다.
SplashScreen API는 cold/warm start에서만 표시되고, hot start에서는 표시되지 않는다.
- 시스템은 개발자가 정의한 테마와 애니메이션을 사용하여 스플래시 화면을 표시
- 앱이 준비되면 스플래시 화면이 닫히고 MainActivity 표시
스플래시 구현
1. build.gradle (Module)에 의존성 추가
dependencies {
...
implementation 'androidx.core:core-splashscreen:1.0.0-rc01'
}
2. themes.xml에 새로운 스타일 생성
<style name="Theme.App.Starting" parent="Theme.SplashScreen">
<item name="windowSplashScreenBackground">@color/...</item>
<item name="windowSplashScreenAnimatedIcon">@drawable/...</item>
<item name="postSplashScreenTheme">@style/...</item>
</style>
windowSplashScreenBackground: 스플래시 화면의 백그라운드 컬러
windowSplashScreenAnimatedIcon: 스플래시 화면의 중앙에 위치할 아이콘 Drawable
postSplashScreenTheme: 스플래시 화면이 끝난 후 보이는 액티비티의 테마
3. Manifest.xml에서 액티비티에 스플래시 적용
<activity
...
android:theme="@style/Theme.App.Starting">
<intent-filter>
...
</intent-filter>
</activity>
4. 액티비티에서 setContentView를 호출하기 전 installSplashScreen() 호출
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
installSplashScreen()
setContentView(R.layout.activity_main)
}
}
스플래시에 애니메이션을 적용할 경우, installSplashScreen()에서 반환되는 객체를 통해 설정한다.
https://developer.android.com/topic/performance/vitals/launch-time?hl=ko
https://developer.android.com/guide/topics/ui/splash-screen?hl=ko
https://developer.android.com/guide/topics/ui/splash-screen/migrate?hl=ko
'app > android' 카테고리의 다른 글
[안드로이드/코틀린] 뷰 바인딩 (ViewBinding) (0) | 2023.09.16 |
---|---|
[안드로이드/코틀린] 툴바(Toolbar) 커스텀 방법 (1) | 2023.09.16 |
[안드로이드/android] 자바로 백그라운드 서비스 WorkManager 구현하기 (0) | 2022.09.29 |
[안드로이드/android] 클래스 안에 브로드캐스트 클래스를 만들었을 때 Manifest 지정하는 법 (0) | 2022.09.19 |
[안드로이드/android] 디바이스 해상도 뷰 고정시키는 방법 (0) | 2022.09.03 |