Como o novo FragmentTransaction commitNow () está funcionando internamente?

O novocommitNow () O método adicionado no Android N e na biblioteca de suporte versão 24 possui uma documentação limitada e um pouco confusa.

Confirma esta transação de forma síncrona. Quaisquer fragmentos adicionados serão inicializados e trazidos completamente para o estado do ciclo de vida de seu host, e quaisquer fragmentos removidos serão removidos adequadamente antes que essa chamada retorne. A confirmação de uma transação dessa maneira permite que os fragmentos sejam adicionados como componentes encapsulados dedicados que monitoram o estado do ciclo de vida de seu host, fornecendo garantias de pedidos mais firmes quando esses fragmentos estão totalmente inicializados e prontos. Fragmentos que gerenciam visualizações terão essas visualizações criadas e anexadas.

Chamar commitNow é preferível a chamar commit () seguido por FragmentManager.executePendingTransactions (), pois o último terá o efeito colateral de tentar confirmar todas as transações pendentes atualmente, seja esse o comportamento desejado ou não.

As transações confirmadas dessa maneira podem não ser adicionadas à pilha traseira do FragmentManager, pois isso quebraria outras garantias de pedidos esperadas para outras transações confirmadas de forma assíncrona. Este método lançará IllegalStateException se a transação anteriormente solicitada para ser adicionada à pilha traseira com addToBackStack (String).

Uma transação só pode ser confirmada com esse método antes da atividade que contém o salvamento de seu estado. Se a confirmação for tentada após esse ponto, uma exceção será lançada. Isso ocorre porque o estado após a confirmação pode ser perdido se a atividade precisar ser restaurada a partir do estado. Consulte commitAllowingStateLoss () para situações em que pode ser bom perder a confirmação.

Destaquei em negrito a parte que acho confusa.

Portanto, minhas principais preocupações / perguntas são:

1 - Eles NÃO PODEM ser adicionados? Ele diz que vou receber uma IllegalStateException, então será ou não será adicionado?

2 - Aceito o fato de que não posso usar isso se queremos adicionar um fragmento no backstack. O que não diz é que você recebe essa exceção:

java.lang.IllegalStateException: This transaction is already being added to the back stack

!!!! ????

Então eu não posso ligaraddToBackStack(String) eu mesmo porque está chamando isso internamente para mim? Me desculpe, mas ... o que? porque? e se eu não quiser que ele seja adicionado no backstack? E se eu tentar usar esse fragmento do backstack mais tarde, mas porque NÃO PODE ser adicionado, depois não estará lá?

Parece que isso é algo esperado se eu estivesse usandocommitAllowingStateLoss()mas eu vejo issocommitNowAllowingStateLoss() também existe, então ... que tipo de lógica ela segue?

TL; DR

Como o commitNow () está trabalhando internamente em relação ao backstack?

questionAnswers(1)

yourAnswerToTheQuestion