최근에는 구식인 UI흐름이지만,
로그아웃을 했을 때, 로그인 화면을 띄워야 할 때가 있다.
이때, 스택에 쌓여있는 기존 Activity들을 모두 제거할 수 있다면 흐름에 방해되는 골치아픈 문제들을 한 방에 해결할 수 있다.
Intent intent = new Intent(context, classToShow); if (Build.VERSION.SDK_INT > Build.VERSION_CODES.GINGERBREAD_MR1) { intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); } else { intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); } startActivity(intent);
간단히 플래그에 대해 설명하면,
FLAG_ACTIVITY_CLEAR_TASK : 현재 TASK를 비운다.
FLAG_ACTIVITY_NEW_TASK : 새로운 TASK를 생성한다. (Activity가 아닌 곳에서 Activity를 띄울 때, 종종 사용하는 플래그)
한 가지 문제는 첫 번째 플래그, FLAG_ACTIVITY_CLEAR_TASK 는 API Level 11(허니콤)부터 사용이 가능해서 진저브레드를 지원하는 앱에서는 사용이 불가능하다. (당연하지만 플래그를 적용한다해도 원하는데로 동작하지 않는다.)
만약, 진저브레드를 지원해야한다면 버전코드를 확인해서 동작을 달리해야한다.진저브레드는 FLAG_ACTIVITY_CLEAR_TOP를 사용해서 처리했는데,
애초에 진저브레드의 경우에는 로그인화면에서 로그인이 완료되었다고 해도 Activity를 종료하지 않았다.
반면에, 허니콤 이상의 경우 쿨하게 finish()를 호출했다. 아래 코드 처럼.
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.GINGERBREAD_MR1) { finish(); }
즉, 진저브레드는 FLAG_ACTIVITY_CLEAR_TOP을 이용해서, 스택 맨 하단에 있는 로그인 Activity를 남기고 중간의 Activity는 종료시키는 방법을 적용. 상위 OS 버전과 동작을 맞췄다.
이 경우, 또 다른 문제가 있는데, 진저브레드에서는 앱을 종료시킬 때 단순히 메인 Activity를 finish()를 호출하면 밑에 있었던 로그인 Activity가 보이게된다. 결국에는 (권장하는 방법은 아니라고 하지만...) killProcess를 사용하면 된다.
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.GINGERBREAD_MR1) { finish(); } else { android.os.Process.killProcess(android.os.Process.myPid()); }
지금까지 찾은 가장 깔끔한 방법인데, 더 우아한 방법이 있다면 조언바랍니다.
사실은 최근 트랜드에 맞는 UI흐름을 구성하면 좋겠지만
살다보면 참 마음대로 안 될때가 많네요. ^0^
'Android' 카테고리의 다른 글
[Android] Google Play Services Lib 중 필요한 API만 선택하여 빌드하기 (0) | 2015.07.10 |
---|---|
APK에서 리소스 훔쳐보기 (0) | 2014.12.18 |
InentService를 구현했으나, onHandleIntent()가 호출되지 않을 때 (2) | 2014.08.21 |
[Android] 화면꺼짐 상태에서 GCM 메시지 수신 안되는 문제 (2) | 2014.01.24 |
[번역글] 프레그먼트 #4 - 프레그먼트 다루기 & 조작하기(Transactions) (0) | 2014.01.22 |