라떼는말이야
[Android] 로그인과 메인 액티비티 플로우 (with NoDisplay theme) 본문
앱 개발에서 가장 일반적인 패턴 중 하나는 LoginActivity에서 로그인 후 MainActivity로 전환되는 것이다.
사용자가 LoginActivity에서 올바른 자격 증명을 입력하면 앱은 LoginActivity를 종료하고 MainActivity를 시작한다.
일반적으로 사용자가 이후에 다시 앱을 실행시켰을 때 로그인을 다시 할 필요 없게 하는 것을 원할 것이다.
이를 실현하기 위해서 몇 가지 접근법이 있는데, 가장 쉬운 것은 사용자가 앱을 사용할 때마다 매번 로그인을 강제하는 것이다. 하지만 이 방법은 유저 경험(UX)에 아주 끔찍한 방법이다.
일반적으로 사용자가 로그인하면 몇 종류의 토큰을 반환하고, 그것을 앱의 생명주기 외부 어딘가에 저장하면 된다.
일단 토큰을 받았다면, 토큰의 기간이 만료되기 전까지 사용자의 로그인을 유지시켜줄 수 있다.
과거에 사용되던 방법은 LoginActivity나 MainActivity를 Manifest에서 메인(시작 화면)으로 설정하는 것이다.
만약 LoginActivity가 메인으로 설정됐다면, 토큰이 저장되어있는지 확인하고, 만약 그렇다면 MainAcitivty를 실행시킨 후 (LoginActivity를) 종료시킨다.
MainActivity가 메인으로 설정됐다면, 토큰이 저장되어 있는지 확인 후 저장되어있지 않다면 LoginActivity를 실행시킨 후 (MainActivity를) 종료시킨다.
이런 접근 방식은 효과는 있지만 약간 투박하고 느리다.
여기서는 NoDisplay Theme이란 것을 소개할 것이다. MainEmptyActivity라는 액티비티를 만들고 이 액티비티를 메인으로 설정한다.
MainEmptyActivity
class MainEmptyActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// go straight to main if a token is stored
val activityIntent: Intent = if (Util.getToken() != null) {
Intent(this, MainActivity::class.java)
} else {
Intent(this, LoginActivity::class.java)
}
startActivity(activityIntent)
finish()
}
}
그리고 Manifest에서 메인으로 설정한다.
AndroidManifest.xml
<activity
android:name=".activity.MainEmptyActivity"
android:theme="@android:style/Theme.NoDisplay">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
이 플로우에서는 토큰이 만료되었는지 고려하는 것도 중요하다. 만료되었다면 LoginActivity로 다시 보내고, 저장소에서 토큰을 삭제해야 한다.
일반적으로는 모든 요청에서 응답 코드를 확인하고, 401이라면 토큰이 만료된 것으로 간주하지만 응답은 서비스마다 다를 수 있다.
로그인과 메인 이렇게 2개의 상태를 가지는 것이 가장 일반적인 형태이지만 더 많은 상태에 대해서도 적용할 수 있는 방법이다.
다른 대안으로는 NoDisplay theme 대신에 스플래시 화면을 사용할 수도 있겠다. (최근 안드로이드 12에서는 스플래시 api가 강제되어 이제는 이 방법을 사용하게 될 듯싶다)
하지만 어떤 방법을 사용하더라도 플로우는 비슷한 방법으로 진행될 것이다.
출처 : https://medium.com/android-news/login-and-main-activity-flow-a52b930f8351
'안드로이드' 카테고리의 다른 글
CoroutineContext and CoroutineScope in Kotlin and Android (0) | 2022.07.07 |
---|---|
[android] DataBinding Error - "if getId is called on an expression, it should have an id" (0) | 2022.03.15 |
[Android] 상태 바(Status Bar), 기본 배경 색상 변경하기 (0) | 2022.01.19 |
[Android] 비밀번호 정규식으로 제한하기 (password regex) (0) | 2022.01.16 |
[Android] inputType에 따른 InputFilter 동작 차이: 같은 로직에 그렇지 못한 동작 (2) | 2022.01.16 |
[Android] Toast 하나만 띄우기 (Toast 취소하기) (0) | 2022.01.15 |
[안드로이드 스튜디오] Login Activity 템플릿 살펴보기 (0) | 2022.01.11 |
[Android] 실습으로 알아보는 프래그먼트 생명주기 : Android fragment lifecycle (0) | 2021.12.10 |