최근에는 구식인 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^




Posted by 데브로망스

댓글을 달아 주세요