안드로이드 올바른 스플래시 화면을 구현하기 위한 방법

2017-04-07
 

많은 실험 과정 속에서 안드로이드 스플래시 화면 구현에 대해 좋은 방법을 발견하였습니다. 보통 스플래시 화면 구현은 Activity에서 Runnable을 통해 시간을 지연하는 방식으로 구현합니다. 이는 약간의 문제점을 발생시킵니다.

실제로 스플래시 동안 아무런 작업을 하지 않지만 사용자는 무작정 기다려야 하는 문제가 있습니다. 또한 Application이나 Launch Activity에 많은 작업이 이루어진다면 Activity에서 레이아웃 인플레이트가 지연되어 스플래시 화면이 늦게 뜨는 문제점이 발생됩니다.




이런 문제점을 보완하여 앱을 로드하는 동안 스플래시 화면을 보여주기 위한 멋진방법을 소개해드리겠습니다.


코드

먼저 스플래시 화면을 사용한 레이아웃을 Drawable로 다시 디자인합니다. layer-list를 이용하여 배경 색상과 로고 이미지를 배치합니다.

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:opacity="opaque">
    <item android:drawable="@color/colorPrimary"/>
    <item>
        <bitmap
            android:gravity="center"
            android:src="@mipmap/ic_launcher"/>
    </item>
</layer-list>

이제 Activity에 사용할 테마의 windowBackground값에 이전에 만든 Drawable로 바꿔줍니다.

<style name="SplashTheme" parent="AppTheme">
  <item name="windowNoTitle">true</item>
  <item name="windowActionBar">false</item>
  <item name="android:windowBackground">@drawable/splash</item>
</style>

안드로이드 매니페스트에서 런치 될 Activity의 테마를 위에서 만든 스플래시 테마로 설정합니다.

<activity android:name=".MainActivity"
  android:theme="@style/SplashTheme">
  <intent-filter>
      <action android:name="android.intent.action.MAIN" />

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


Activity에서 onCreate전 setTheme를 이용하여 원래의 테마로 돌립니다.

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        setTheme(R.style.AppTheme);

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}





Activity가 실행되기 전에 테마의 Background를 Drawable로 구성된 스플래시 화면을 보여주며 Activity가 생성되고 레이아웃 인 플레이트 되기 전 원래의 테마로 돌려줌으로써 스플래시 화면을 위한 Activity를 새롭게 생성할 필요가 없습니다.

이렇게 간단한 리소스를 이용한다면 앱의 초반 로딩 속도가 늦는 경우 로딩 프로그래스 대신 스플래시 화면을 사용하는 것도 나쁘지 않은 선택이 될 것입니다.


모든 코드는 Github에 공개되어있습니다.