스플래시 화면이란 어플리케이션을 실행할 때 보여주는 로딩 화면을 의미합니다. 처음 스플래시 화면을 도입하게 된 계기는 애플리케이션 구동시 처리해줘야 할 사항이 많은데(버전체크, 기본 데이터 로딩, 서버에 접속 등) 그 일들이 처리되는 동안 제대로 구성되지 않은 화면을 사용자들이 보고 있는 경우 애플리케이션의 완성도가 떨어진다고 판단되어 생겨난 디자인이라고 합니다. 또한 앱을 켤 때 꾸준히 노출되는 디자인이기 때문에 앱 브랜드를 홍보하기 위한 창구로 활용되고 있기도 합니다.
그래서 스플래시 화면은 내부적인 기능이라기 보다는 디자인 적인 측면이 강합니다. 하지만 대부분의 애플리케이션이 스플래시 화면을 통해 앱의 완성도를 올리고 있는 추세라 사용법을 알아두는 것이 좋습니다.(물론 스플래시 스크린 자체의 기능은 매우 단순하고 쉽습니다.)
가장 먼저 해야할 일은 역시 액티비티를 선언해주는 것입니다. 이 부분은 안드로이드의 manifests에 작성하는 것으로 스플래시 액티비티가 어플 구동시 제일 먼저 떠야 하는 화면이기 때문에 MAIN으로 설정해주어야 합니다.
<activity
android:name=".activity.SplashActivity"
android:theme="@style/SplashTheme"
android:screenOrientation="portrait"
tools:ignore="LockedOrientationActivity"
android:noHistory="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
여기서 미리 theme를 지정해줍니다. 저 테마는 실제로 사용자에게 보여주기 위한 로딩 화면을 다루고 있는 style입니다.
screenOrientation의 옵션의 경우 화면의 orientation 값을 설정해주기 위해 사용됩니다. portrait의 경우 세로모드를 유지하겠다는 것을 의미하고 있습니다. 기본적인 activity의 옵션이기 때문에 변경해주어도 상관 없지만, 스플래시 화면의 특성상 세로모드로 켜지는 경우가 많기 때문에 기본적으로는 portrait을 유지하고 있었습니다만... 그 아래의 ignore를 보시면 LockedOrientationAcitivity를 설정해주고 있는데, 이는 android studio 3.6 이상 버전부터는 개발자가 직접 screenOrientation을 통해 모드를 설정하는 경우 경고를 날리는데, 그 부분에 대한 경고를 무시하겠다는 의미입니다.
확실히 구글에서 권장하는 방식으로 사용하겠다면 이제는 사용하지 않는 것이 좋습니다.
noHistory의 경우 특별한 건 없고 이름 그대로 안드로이드 job에 이 액티비티를 저장하지 않겠다는 의미입니다.(뒤로가기 버튼을 누르면 이 액티비티로 돌아가지 않게 됩니다! 뒤로가기를 눌렀을 때 로딩 화면으로 돌아오면 안되니까요.)
<!-- 스플래시 배경 -->
<style name="SplashTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:background">@drawable/bg_splash</item>
</style>
manifests를 추가했다면 그 다음은 style을 지정해주는 것입니다. 사실 스플래시 화면의 제일 큰 주의점이 여기 있습니다. activity라고 하면, 테마가 아닌 setContentView를 통해 xml 이미지를 가져와서 화면을 생성하는 것이 대부분인데 스플래시 화면은 사용자가 특별한 기능을 해주지 않고, 결국 화면이 로딩되는 시간동안 빈 페이지가 짧게 노출되는 시간이 존재하기 때문에 그러한 방식은 사용할 수 없습니다. 그래서 따로 테마를 위한 style을 지정해주어야 합니다.
drawable에 미리 넣어둔 이미지(bg_splash)를 이용해 보여줄 화면을 지정합니다. 이렇게 테마로 지정해두게 되면 빈 페이지가 테마 화면으로 덮여져 나오게 됩니다.
class SplashActivity : AppCompatActivity() {
companion object {
private const val SPLASH_DELAY_TIME = 1500L
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
start()
}
private fun start(){
CoroutineScope(Dispatchers.Default).launch {
delay(SPLASH_DELAY_TIME)
CoroutineScope(Dispatchers.Main).launch {
Intent(baseContext, MainActivity::class.java).run {
flags = Intent.FLAG_ACTIVITY_SINGLE_TOP
startActivity(this)
}
finish()
}
}
}
}
스플래시 액티비티 구성입니다. 테마를 통해 빈 페이지를 채워주었으므로 굳이 새로운 화면을 띄워줄 이유가 없고(그래서 xml 파일도 필요 없습니다.) 따로 사용자와의 상호작용이 필요하지도 않으니 기본적인 구성은 매우 간단하게 이루어집니다.
이 화면에서 이제 실제 애플리케이션이 시작되기 전에 해야할 초기화와 같이 적용해야 할 기능을 start 내부에 구성할 수 있습니다.(꼭 start가 아니어도 상관은 없습니다! 예제일 뿐입니다.)
이렇게 작성하면 기본적인 스플래시 화면의 작성이 끝이 났습니다. 이제 이 시간을 효율적으로 사용하는 방법은 애플리케이션의 동작 방식에 따라 달라지겠죠...
하지만 이런 스플래시 화면을 제작할 때 제일 주의해야 할 점이 있습니다. 바로 스플래시 화면 내부에서 또 다른 화면(fragment)을 작성하게 되면 여러가지 버그가 발생할 수 있습니다. 기본적으로 페이지를 가득 채우지 않으면 테마 화면이 맨 아래 깔려있다는 점이나, EditText의 화살표와 같은 것들 뒤에 배경이 splashTheme와 동일한 것으로 구성되어 있다던지 하는 문제가 있습니다.
이는 테마를 투명하게 바꿔주면 처리가 가능하지만, 왠만하면 스플래시 화면은 스플래시 화면으로만 남겨두는 편이 이롭습니다.(또한 권장되는 방식입니다.)
'안드로이드 > 코틀린' 카테고리의 다른 글
(android-jetpack)AAC에서의 뷰모델 (0) | 2021.03.30 |
---|---|
(android - jetpack)데이터 바인딩 작업 (0) | 2021.03.22 |
Kotlin으로 만든 커스텀 버튼 (0) | 2021.02.09 |
Gson과 JSON의 toString (0) | 2021.01.23 |
디버깅과 릴리즈, 그리고 proguard (0) | 2020.09.03 |
댓글