티스토리 뷰


흔히 어플리케이션이 켜지기 전 나오는 화면을 Splash screen 혹은 Launch screen이라고 부릅니다.

이 화면은 어플리케이션이 준비될 때까지 표시되는 화면으로써,
앱 구동 중 나타나는 흰색 화면과 같은 화면을 대신해서 나타납니다.
흰색 화면만 덩그러니 놓여 있으면 앱이 제대로 켜진 건지 구분이 잘 안가죠.

스플래시 스크린을 사용하면 빈 화면보다 작동 여부가 분명하게 보이고,
 브랜드 로고 노출을 통한 인지도 상승도 자연스레 생기게 됩니다.

구글에서는 이 스플래시 스크린을 두 가지로 구분했는데요, 첫 번째는 Placeholder UI이고, 두 번째는 Branded launch screens입니다.
전자는 로딩이 완료됐을 때 띄워질 화면과 비슷한 화면을 띄우는 방식이고,
후자는 아예 브랜드 로고 등이 담긴 화면을 띄우는 방식입니다.
이번에 구현할 화면은 후자(Branded launch screens)입니다.

* 참고 : 이 글은 2016년 12월에 작성된 글로, API 25버전, 즉 Android 7.1.1 (Nougat)을 기준으로 합니다.


1. 먼저 스플래시 스크린을 만듭니다.
예시에 사용된 값은 검정 배경에 앱 아이콘입니다.

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@android:color/black" />
    <item>
        <bitmap android:src="@mipmap/ic_launcher" android:gravity="center" />
    </item>
<layer-list>

 

2. 스플래시 스크린을 띄워 줄 액티비티를 하나 만듭니다. 혹시 액티비티를 생성할 때 안드로이드 스튜디오의 자동 생성(add)을 통해 생성하셨다면, 액티비티의 xml 파일은 지워주세요(예: SplashActivity를 만들어서 생긴 activity_splash.xml은 지웁니다).이 액티비티는 inflate를 하지 않기 때문에 불필요합니다.

3. styles.xml에 스플래시 스크린을 위한 테마를 추가해 주고 난 다음,
AndroidManifest.xml에서 스플래시 스크린 액티비티에 테마와 인텐트 필터(앱을 켜면 Splash Activity가 가장 먼저 켜지도록)를 적용시켜 줍니다.

<!-- styles.xml -->
<!--기존에 있는 앱 테마 -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

<!-- 스플래시 스크린 액티비티용 테마 -->
<style name="SplashTheme" parent="AppTheme">
    <item name="android:background">@drawable/splash</item>
</style>
<!-- AndroidManifest.xml -->
<application ...(중략)>
    <activity android:name=".SplashActivity"    android:screenOrientation="portrait"
        android:theme="@style/SplashTheme">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

 

4. 스플래시 액티비티가 실행되면 곧바로 MainActivity가 실행되도록 합니다.
위에서 잠깐 언급했듯 이 액티비티는 뷰를 inflate 하지 않습니다. 따라서 setContentView가 불필요합니다.

public class SplashActivity extends Activity {
    @Override protected void onCreate(Bundle savedInstance) {
        super.onCreate(savedInstance);
        //setContentContentView는 하지 않습니다.
        startActivity(new Intent(this, MainActivity.class));
        finish();

 

결과물

여기서 사용되는 SplashActivity는 startActivity() 메소드가 끝나기만을 기다리고 있습니다. 그리고 startActivity()가 끝나면 곧바로 finish() 메소드를 호출해 SplashActivity가 종료됩니다. 여기서 startActivity()가 끝나기를 기다린다는 것은 SplashActivity가 MainActivity의 로딩이 끝날 때까지 기다린다는 의미가 됩니다.

만약 항상 똑같은 시간 동안 스플래시 스크린을 띄우고 싶다면, finish() 앞에 sleep과 같은 타이머로 딜레이를 주면 됩니다.


참고 :
https://www.bignerdranch.com/blog/splash-screens-the-right-way/

댓글
  • 프로필사진 jyj xml 파일은 만들 필요 없다고 하셨는데 1번에
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    </layer-list>
    는 어디에 만드나요??
    2020.12.01 13:33
댓글쓰기 폼