본문 바로가기
⛏️ | 개발 기록/🪐 | Cosmic Detox

[Android] SplashScreen Api를 이용해 로그인 여부 확인

by immgga 2024. 9. 17.

출처: unsplash.com

 

부트캠프 최종 팀 프로젝트 기록 11

 

 

서론

오늘의 구현 기능은 자동 로그인 기능이다.

Firebase Authentication을 사용 중이기 때문에 현재 FirebaseAuth의 currentUser.uid가 null이 아니면 사용자가 로그인되어 있다는 뜻이기 때문에 이 경우에는 MainActivity로 이동하고, 아닐 때는 로그인이 필요하기 때문에 SignInActivity로 이동하게 하는 기능이다.

이 기능은 현재 구현이 되어 있지만, SignInActivity의 onStart lifeCycle 함수에 구현되어 있기 때문에 사용자가 이미 로그인을 했어도 SignInActivity를 보고 MainActivity로 넘어가게 되는 아주 사소한 이슈가 있다.

이 이슈를 해결하기 위해 Android 12부터 사용 가능하게 된 splash screen api를 사용해서 splash 화면에서 자동 로그인을 처리할 수 있도록 해주는 기능을 구현해 보겠다.

 

 

SplashScreen Api

splash screen api는 android 12에 자동 splash screen이 들어오게 되면서 같이 생겨난 splash 전용 api이다.

splash screen api는 기존의 android 12 이하의 앱에서도 android 12처럼 splash screen이 뜰 수 있도록 해주는 기능을 가지고 있다.이 api를 사용하기 위해서는 gradle에 라이브러리를 추가해 주어야 한다.

implementation("androidx.core:core-splashscreen:1.0.1")

 

Splash Screen Api 사용하기

이제 splash api를 사용해 보자.

앱 실행 시 처음 시작되는 Activity에 적용해야 한다.

activity의 setContentView 전에 installSplashScreen을 적용한다.

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    enableEdgeToEdge()

    splashScreen = installSplashScreen()
    splashLogic()
    setContentView(binding.root)
    . . .
}

installSplashScreen을 해주고 초기화한 splashScreen 변수로 splashScreen이 실행될 동안 수행할 로직을 생성할 수 있다.

그 코드는 splashLogic()에 있다.

private fun splashLogic() {
    val auth = FirebaseAuth.getInstance()
    splashScreen.setKeepOnScreenCondition {
        if (auth.currentUser?.uid == null) {
            val intent = Intent(this, SignInActivity::class.java)
            intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
            startActivity(intent)
        }
        false
    }
}

이 함수에 splash screen이 보일 동안의 로직을 담을 수 있다.splashScreen.setKeepOnScreenCondition은 boolean 인자를 이용해 현재 splash screen을 열 것인지 말 것인지 정할 수 있다.true만 적으면 무한대로 splash screen이 보이는 현상(?)을 볼 수 있다.그래서 위 함수 안에 현재 firebase authentication의 사용자가 들어 있는지 확인 후 들어 있지 않을 때(null인 경우), SignInActivity로 이동시킨 후, splash screen을 종료(false)시킨다.

 

결론은 setKeepOnScreenCondition 안에 나만의 splash logic을 집어넣고(내 경우는 로그인 여부 확인), false로 splash를 끝내면 된다.

 

 

구현 중 발생한 문제 상황

splash screen 전용 테마를 설정해야 한다고 타 포스팅에 언급되어 있어서 그 포스팅대로 splashTheme를 적용했는데, 기존의 theme가 적용되지 않는 문제가 발생했다.

splash theme를 빼고 실행했더니 정상적으로 돌아갔다. 결론은 splash theme는 필수가 아니다.

 

 

정리

splash screen api로 사용자 로그인 여부 확인 로직을 구현해 봤다.splash screen에서 이루어지는 작업이라 사용자들이 SignInActivity를 봐야 하는 사소한 문제를 해결할 수 있었다.

728x90