티스토리 뷰

이 글은 Big Nerd Ranch에 Chris Stewart가 기고한 글에서 발췌 및 각색한 내용 입니다.

원문은 아래 링크에서 참고하실 수 있습니다.

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


안드로이드 애플리케이션에서 스플래시 스크린 - 앱을 실행할 때 주로 앱 로고를 중앙에 띄우는 인트로 페이지죠 - 은 곧바로 메인페이지로 넘어가기엔 밋밋해서 넣는 경우도 있는데 사실 이외에 다른 목적도 있습니다. 예를 들면 불러오는데 시간이 걸리는 데이터들을 (하지만 곧바로 쓰일) 인트로 화면을 띄워놓은 상태에서 미리 가져올 수도 있습니다.  


스플래시 스크린은 맨 처음 시작하는 녀석이고 그렇기때문에 곧바로 준비되어야 하기 때문에 액티비티에서 layout file이 inflate되기도 전에 보여야 합니다.


그렇기 때문에 layout file에 스플래시 스크린을 디자인하는 것은 좋지 않습니다.

대신 백그라운드 액티비티의 테마 백그라운드로 만들 수 있습니다.


우선 아래와 같이 drawable 파일을 만들어 배경색과 중앙에 이미지를 설정합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
<!--drawable/splash.xml-->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
 
    <item
        android:drawable="@color/gray"/>
 
    <item>
        <bitmap
            android:gravity="center"
            android:src="@mipmap/ic_launcher"/>
    </item>
 
</layer-list>
cs


다음으로 이걸 스플래시 액티비티의 백그라운드 테마로 설정합니다. style.xml 파일로 가서 스플래시 액티비티를 위한 새로운 테마를 추가합니다.

1
2
3
4
<!--values/style.xml-->
<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="android:windowBackground">@drawable/splash</item>
</style>
cs


다음으로 매니페스트에서 이 테마를 스플래시 액티비티에 설정해봅니다. 

1
2
3
4
5
6
7
8
9
<activity
    android:name=".SplashActivity"
    android:theme="@style/SplashTheme">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
 
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
cs


이렇게 하면 이제 시작할 때 딜레이 없이 스플래시 화면이 뜨게 됩니다!

스플래시 액티비티가 띄워지고 메인페이지로 넘어가는 로직은 액티비티 내에서 구현을 해주면 되겠죠?


저 같은 경우 스플래시 액티비티에서 서버로 요청을 보내 현재 사용자가 세션을 유지하고 있는지 확인한 후 콜백을 받아서 로그인 세션이 있는 경우 메인 페이지로 그렇지 않다면 로그인 페이지로 넘어가는 로직을 구현했습니다. 


이 방법을 알기 전까지는 계속 layout file을 이용해 스플래시 스크린을 만들어 왔는데요. 안 그럴 수도 있지만 레이아웃을 inflate하는 작업이 조금 늦어지면 스플래시 화면이 곧바로 보이지 않을 수도 있을 것 같고 확실히 이 방법이 더 깔끔하다는 생각이 듭니다.


[+추가]

하지만 위의 방법을 사용하면 발생하는 문제가 한 가지 있습니다. 만약 Layout file을 사용했다면 이미지 크기를 DP값으로 자유자재로 설정할 수 있는데 위의 drawable 파일에서 bitmap으로 가져온 이미지의 크기를 변경할 수 없다는 점입니다. 이 부분에 대해서 어떻게 bitmap 크기를 변경시킬 수 있을지 조사를 해보았는데 현재까지 얻은 결론은 bitmap이미지 크기는 변경할 수 없으며 그렇기 때문에 각 해상도에 적합한 이미지를 따로 준비해야 한다는 것이었습니다.


즉, 해상도가 다른 디바이스에서 같은 스플래시 화면을 보이기 위해서는 여러 크기의 이미지를 준비해야 합니다. (꼭 같아야 할 필요가 없다면 적당한 크기의 이미지 하나만 사용하여도 상관없을 것 같습니다)


댓글