addToBackStack
는 백 스택에 해당 트랜잭션을 추가하는 메서드이다. 추가된 트랜잭션은 commit
된 이후에도 저장되며, 이후 스택에서 꺼내어 사용할 수 있다.
트랜잭션을 스택에서 꺼내며 작업을 되돌리려면 setReorderingAllowed
메서드를 통해 추가할 트랜잭션의 reorderingAllowed
속성을 true
로 설정해주어야 한다.
트랜잭션 내부 및 트랜잭션간의 작업들을 최적화할지 설정하는 메서드이다. true
로 설정할 경우 중복되거나 어차피 취소될 작업들을 제거한다.
val transaction = fragmentManager.beginTransaction()
transaction.add(R.id.container, FragmentA()) // 첫 번째 명령
transaction.replace(R.id.container, FragmentB()) // 두 번째 명령
transaction.setReorderingAllowed(true)
transaction.commit()
이런 작업이 있다고 가정할 때, FragmentA
는 즉시 FragmentB
로 replace
되기에 사실상 생성할 필요가 없어진다. 시스템 입장에서는 FragmentA
를 생성할 필요가 없다고 판단해 제거한다.
하지만 이는 onCreate
, onDestroy
같은 생명주기를 거치지 않을 수도 있다는 의미이기 때문에 주의해야 한다. 이 과정에서 부작용이 발생할 수 있다.
트랜잭션 1: Fragment A를 추가
트랜잭션 2: Fragment B를 추가
트랜잭션 3: Fragment A를 제거
위 3개의 트랜잭션이 순서대로 수행된다고 가정하자. 중복된 작업을 제거하지 않는다면 FragmentB
가 생성될 때 FragmentA
가 존재할 것이라고 생각할 것이다. 하지만 setReorderingAllowed(true)
를 통해 중복 작업이 제거되며 예상과는 달리 FragmentA
가 생성조차 되지 않았다는 상황에 처한다.
더 나은 트랜지션을 위해 프래그먼트 내부의 상태 변화 순서를 재정렬할 수도 있다. 추가될 프래그먼트의 onCreate
가 기존 프래그먼트의 onDestroy
호출 전에 호출될 수 있다. 이렇게 하면 파괴 → 생성 사이에 생기는 격차가 없어지며 자연스럽게 전환이 가능하다.