Fragment Transaction 동작 분석
런타임 시 Fragment 를 추가, 삭제, 대체할 경우에는 FragmentManager 의 beginTransaction() 메서드를 사용하여 트랜잭션 객체를 생성한 후, 트랜잭션 내에 명령어들을 추가하고 마지막으로 commit() 메서드를 사용하여 해당 트랜잭션에 모든 명령이 담겼다는 것을 알려줘야 한다. 이 문서를 작성하는 이유는 developer android 문서를 읽고 이해하려고 해봤지만 다소 추상적인 내용들이 있어서 좀 더 구체적으로 이해를 해야 할 필요성을 느꼈기 때문이다.
1. add, replace, remove 등의 메서드가 호출되면 FragmentTransaction 내의 mOps 자료구조에 해당 명령이 저장된다.
2. addToBackStack 메서드를 실행하면 FragmentTransaction 내의 mAddToBackStack Flag 를 true 로 설정한다
3. FragmentTransaction 의 commit() 메서드를 실행하면 FragmentManager 내에 있는 mBackStack 자료구조에 공간을 할당하고 FragmentManager 에서 관리하는 mPendingActions 라는 이름의 Event Queue 에 FragmentTransaction(정확히는 BackStackRecord) 를 저장한다.
4. FragmentManager 의 execPendingActions() 메서드가 실행되어서 addToBackStackState() 메서드가 실행되어서 mBackStack 자료구조에 트랜잭션이 저장되고, 추가된 BackStackRecord 내의 명령들을 실행한다.
요약
supportFragmentManager.beginTransaction().apply { } 로 FragmentTransaction 객체를 가져온다
▶ add, replace, remove 등의 Fragment 전환 메서드를 호출하여 FragmentTransaction.mOps 에 해당 명령을 기록한다
▶ addToBackStack() 메서드를 호출하여 FragmentTransaction.mAddToBackStack 를 true 로 설정한다
▶ FragmentTransaction.commit() 을 호출하여 FragmentManager.mPendingActions 에 해당 트랜잭션을 기록한다
▶ FragmentManager.execPendingActions() 가 호출되어 mBackStack 에 트랜잭션이 기록되고, 트랜잭션의 명령이 실행된다.