어플리케이션 시작 시 특정 이미지나 문구를 출력하여 DB로드나 특정 이벤트가 진행되는 동안 사용자들이 기다리게끔 하는 화면을 많이 사용한다. 이전엔 특정 xml을 대기화면으로 설정 후 최소한 일정시간 동안 동작하게끔 하여 원하는 작업을 수행한 뒤 다음 Activity로 넘어가는 방식을 사용했었다. 그러나 Splash Activity를 사용하면 최소 일정 시간 이상 동작하는 등의 코드와 xml을 따로 구현하지 않고도 초기 시작화면을 구현할 수 있어 두 가지 방법을 모두 간략히 정리하고자 한다.

Delay되어 실행되는 Activity를 Splash로 설정하는 방법

Activity_loading.xml 정의

Android_Splash_screen_01

먼저 어플리케이션 시작 시 화면에 출력할 로딩화면을 layout에 정의한다. 많은 프로젝트들은 이미지를 Background로 사용한다.

LoadingActivity 정의

public class LoadingActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_loading);
        startLoading();
    }
    private void startLoading() {
        Handler mHandler = new Handler();
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                //수행할 작업 작성
                finish();
            }
        }, 1500); //1500ms(1.5s) 후 run함수 내에 작성된 코드 실행
    }
}

로딩화면 자바코드에 어떤 작업을 수행할 지 정의한다. 보통 외부 sqlite DB를 로드한다던지 리소스 파일을 불러온다던지 다양한 작업이 수행된다. 여기서는 아무 작업도 수행하지 않고 끝내기로 하였다.

MainActivity 정의

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent = new Intent(MainActivity.this, LoadingActivity.class);
        startActivity(intent);
        //LoadingActivity에서 finish 함수로 액티비티를 종료하였으므로 다음에 할 작업을 작성하면 된다. 
    }
}

이후 Intent 객체를 LoadingActivity로 전달하면서 MainActivity에서 로딩화면을 실행한다. 이 방법은 로딩화면에 일정 시간을 최소한 할당함으로써 사용자에게 밑작업이 진행되고 있다는 인상을 줄 수 있으며 이후 작성할 SplashActivity가 너무 빠르게 종료되어 렉처럼 보인다고 느낄 때 사용할 수도 있다. 사실 SplashActivity에 delay 코드를 써주면 될 것 같긴 하다...

개선된 방법

굳이 Loading Activity에 수 초를 동작하게끔 정의하여 볼 필요는 없다. 원하는 동작만 완료되면 다음 액티비티로 넘어가게끔 작성하는 것이 기능적으로도 유리하지 않을까 싶다.

Loading 화면 정의

Android_Splash_screen_02

적당한 이미지를 생성하여 drawable 리소스 폴더에 넣어준다. 적당히 스튜디오에서 인식해줄 것이다.

SplashActivity.class 생성

애플리케이션과 호환되게끔 적당히 SplashActivity로 사용할 클래스 파일을 생성한다.

styles.xml 수정

프로젝트 value 폴더 하단의 styles.xml 파일의 내용을 아래와 같이 새롭게 style 태그를 생성하여 추가한다. splash activity에 대한 새로운 테마를 추가한다는 내용이다.

    <style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
        <item name="android:windowBackground">@drawable/background_splash</item>
    </style>

android manifest 파일 수정

        <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>

SplashActivity에 대한 내용을 새로운 Activity를 정의하듯이 추가한다. 위 내용은 SplashActivity가 MainActivity보다 앞으로 오게끔 하여 어플리케이션 시작 시 가장 먼저 실행되게 해준다.

SplashActivity 정의

수행할 동작을 정의하고 Intent 객체를 전달하여 MainActivity로 이동하여 어플리케이션을 시작한다.

public class SplashActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //어플리케이션 본격적인 구동 전 하려는 작업을 작성(DB 등 리소스 로드라던지)
        Intent intent = new Intent(SplashActivity.this, MainActivity.class);
        startActivity(intent);
        finish();
    }
}

참고자료

  1. Splash Screens the Right Way
  2. [android] 로딩화면 구현하기 Splash

+ Recent posts