오늘은 Intent Flag를 Android Studio에서 실제로 사용해보았다.
Activity의 LifeCycle을 보면 첫 화면이 구성되면
onCreate()->onStart() 순서로 실행되고, 만약 다음 액티비티로 넘어가면 첫번째 액티비티는 onStop()후에 두번째 액티비티가 onCreate()->onStart()된다. 그후 첫번째 액티비티는 onStop()된다.
여기가 중요한데, 첫번째 액티비티는 stop되는거지, Destroye되는게 아니다. 이 말은 앱을 종료할때, 뒤로가기를 누르면 앱이 바로 종료되는것이 아니고, 해당 액티비티에 대한 종료를 해주는 것 이니까, 두번째 액티비티에서 첫번째 액티비티로 이동되고, 다시 종료를 눌러야 앱이 종료되는 것이다.(첫번째 액티비티가 Destroye된다).
2개의 액티비티에 대한 LifeCycle

Stack을 따로 관리해주지 않으면 앱을 종료시킬때, 지금까지 실행시켰던 모든 Activity들을 종료시켜야 하는 불편함이 존재하기때문에 Stack을 관리해줘야한다.
먼저 cmd창에서 adb.exe파일이 설치되어있는 곳까지 이동한다.
나는 Users/dldnw/AppData/Local/Android/sdk/platform-tools 에 있었다.
해당 위치에서 'adb shell'을 입력하고, 'dumpsys activity activities | grep -i run'를 입력하면 현재 스택에 쌓인 클래스의 액티비티를 확인할 수 있다.



각 액티비티에서 다른 액티비티로 이동/혹은 취소 할 수 있도록 버튼을 만들어줬고, 2번 액티비티에서는 FLAG_ACTIVITY_SINGLE_TOP를 사용해 보기 위해서 같은 액티비티도 불러올 수 있도록 해줬다.
먼저 앱을 실행하면 1번 액티비티가 stack에 저장될거고, 다음 2번 액티비티를 실행하면 그 위에 2번 액티비티가 push()될거다.

만약 여기서 그냥 2번액티비티를 다시한번 호출한다면 그위에 2번 액티비티가 다시한번 쌓일것이다.

하지만 여기서 FLAG_ACTIVITY_SINGLE_TOP를 사용해주면 가장 최근에 사용됐던 액티비티가 2번 액티비티니까, 해당 액티비티를 재사용해서 stack에 더 추가하지 않는다.

위 stack처럼 쌓이지 않게 된다. 사용법은 아래와 같다.

앱을 실행시키고 1번 액티비티가 실행된후에 차례대로 2번, 3번 액티비티를 호출하면 스택에 순서대로 쌓인다.

여기서, 만약 다시한번 2번 액티비티를 호출한다면 스택에 다시한번 2번액티비티가 쌓일것이다.

하지만 여기서 FLAG_ACTIVITY_CLEAR_TOP을 사용해주면 다시한번 스택에 해당 액티비티를 쌓지 않고, 스택에 해당 액티비티가 존재한다면 해당 액티비티 위에있는 다른 액티비티들을 제거한 후에 해당액티비티를 최상단에 위치하고, 사용할 수 있다. 이를 사용해주면 아래와 같이 스택에 저장된다.

Clear_top의 사용법은 이렇다.

앱을 실행시키고 1번 액티비티가 실행된후에 차례대로 2번, 3번 액티비티를 호출하면 스택에 순서대로 쌓인다.

여기서 다시 2번 액티비티와 1번 액티비티를 실행하면 원래는 그대로 스택에 쌓이지만 NO_HISTORY를 이용하면 스택에 남기지 않고 이동할 수 있다.

뒤에f는 아마도 NO_HISTORY로 인해서 스택에 저장되지 않았다는 뜻인거 같다. 이렇게하면 1번 액티비티에서 뒤로가기를 누르면 2번 액티비티가 아닌 3번 액티비티로 돌아가진다.
이 기능은 회원가입 기능에서 쓰면 좋을 것 같다. 첫 앱을 실행하고, 회원가입을 진행후 로그인해서 앱을 들어가고, 후에 뒤로가기버튼을 누를때 다시 회원가입화면으로 돌아가던 앱을 종종 봤던거 같다.
사용할때 많이 불편했는데 FLAG_ACTIVITY_NO_HISTORY를 사용해주면 좋을 것 같다.
앱을 실행시키고 1번 액티비티가 실행된후에 차례대로 2번, 3번 액티비티를 호출하면 스택에 순서대로 쌓인다.

그 후에 3번 액티비티에서 FLAG_ACTIVITY_NEW_TASK, FLAG_ACTIVITY_CLEAR_TASK두가지를 같이 사용해서 2번 액티비티를 불러오면

Stack에 추가되지 않고, 모든 내용을 지우고 2번액티비티만 Stack에 남게된다.
앞의 Activity들을 다시 돌아갈 일이 없을때? 사용하면 될거같다.
사용법은 아래와 같다.

단순히 정리했을때와 다르게 직접 사용해보니 사용방법과 내용을 확실히 알게 됐다.
AndroidManifest의 LaunchMode옵션을 사용해서 task관리하는법을 직접 해봐야겠다.