compreender o comportamento da actividade inicial para resultados de fragmentos e actividades

é permitida uma comunicação em dois sentidos entre a actividade de origem e a actividade de destino. Seu fluxo é como mostrado no diagrama abaixo.

do abaixo-fluxo, podemos facilmente entender o fluxo de OnActivityResult de Fonte de Atividade para Atividade Destino

A origem da atividade de chamada, startActivityForResult enviando a intenção juntamente com a solicitação de código para Android SDK.

Android SDK então abre a atividade de acordo com a intenção.
uma vez que a actividade de destino terminou com o seu trabalho, volta à sua actividade de chamador.

poderia enviar o resultado de volta usando setResult, enviando o resultCode e a intenção

Várias notas aqui:

O resultCode é usado pelo destino atividade para sinalizar a sua fonte de atividade o que é o estado (e.g. OK, Cancelar, etc.).

o código de pedido é usado pela atividade de origem para saber qual a atividade de destino está retornando a chamada.

podemos ver que a actividade de destino não tem visibilidade do código de pedido.

Indocumentados startActivityForResult Fragmento de Fluxo

No Fragmento, também temos startActivityForResult função a ser chamada, e também onActivityResult função de substituir.Isto levanta várias questões … por exemplo, como funciona? É o mesmo que a actividadeinicial da actividade para osresultados e para osresultados da actividade? Como é que eles estão relacionados?
a resposta curta é, eles são similares, mas sutilmente diferentes. Uma causa frequente de confusão e inseto. Então é importante entender a semelhança e as diferenças.

o fluxo de fragmentos ilustrado.

abaixo está o diagrama que ilustra claramente como tudo funciona em conjunto. As diferenças com a actividadeinicial da actividade e o fluxo de resultados da actividade são coloridas a vermelho.

Vamos mais elaborado sobre ele.

quando chamamos a actividade inicial do fragmento de resultado (nota: não actividade?.iniciaçãoactividadepara osresultados), a criação da actividade de destino é a mesma. No entanto, a diferença é o resultado de uma actividade única.

startActivityForResult() deve tratá-lo a partir de fragment‘s onActivityForResult()

getActivity().startActivityForResult() deve tratá-lo a partir de activity‘s onActivityForResult()

Se você estiver em um fragment e você deseja manipular o resultado em fragment, use onActivityForResult(), caso contrário, se você quer lidar com isso a partir de activity do fragmento, use getActivity.startActivityForResult()

Quando o Android SDK retorna onActivityResult, a solicitação de código que tenha sido alterado. Um 0xP0000 é adicionado ao código original.

o valor-P começa a partir de 1, e o incremento para cada onactividade é chamado a partir do mesmo fragmento de destino. (Se outro fragmento de destino é chamado, o valor P é reiniciado).

por exemplo, se o requestCode original for 0xFF( i.e. 255), o requestCode return da primeira vez será 0x100FF. The second time return requestCode will be 0x200FF.

ao retornar ao resultado da atividade on-activity da fonte, espera-se que ele deve chamar super.onActivityResult, which resides in FragmentActivity (the parent of AppCompatActivity)

The onActivityResult in FragmentActivity will then extract the P value (using requestCode >> 16). O P é o índice da matriz onde o fragmento de origem é armazenado. (por exemplo, se requestCode é 0x200FF, então 0x200FF >> 16 = 2)

usando o valor P, ele agora tem acesso ao fragmento de fonte, que é usado no Passo 9 abaixo.

Now, it strip away the P value from the requestCode( using requestCode & 0xffff), to get back to the original request code (e.g. se o requestCode é 0x200FF, então 0x200FF & 0xFF = 0xFF)

como agora ele recebe o código de pedido original que o fragmento de origem criou, ele poderia chamar o fragmento de fonte onactividade resulta com o código de pedido original.

alguns pontos básicos que querem saber.

A. O comportamento da actividadeinicial da actividade é diferente daactividade inicial do fragmento para o resultado

no fragmento, se chamarmos activity?.startActivityForResult(...), então os fragmentos onActivityResult não serão chamados automaticamente.Se sobrepusermos a actividade é uma actividade isolada, certifica-te de que temos super.onActivityResult in place

If we override source activity’s onActivityResult, but forget to have super.onActivityResult then Fragment’s onActivityResult will not be called.

C. O requestCode visto em atividade onActivityResult é diferente de um fragmento fornecida

Devido à razão de, Android SDK acrescentado P para o requestCode, na atividade do onActivityResult, nós nunca vamos chegar a idêntico requestCode lá. Isso às vezes causa confusão para o desenvolvedor ao depurar o código lá.Quando uma actividade é restaurada a partir do estado (isto é, uma vez por trimestre != nulo), deve evitar recriar o seu fragmento.

Quando onActivityResult é chamado, ele tentou recuperar o fragmento original. Isto também é realizado para a atividade que é restaurada a partir de um estado morto (por exemplo, emulado usando Não manter a atividade).Assim, se o desenvolvedor recriar o fragmento cada vez que o onCreate é chamado (independentemente de ser um estado restaurado ou não), então o fragmento original que foi restaurado será destruído, e onActivityResult do ouvinte, o fragmento misteriosamente não será chamado.

este é um pitfall mesmo para muitos desenvolvedores experientes e app lançado no campo, como é muito difícil para um bug identificado (uma vez que não está acontecendo todas as vezes, e requer um fluxo mais complexo para ativar).Obrigado pela leitura …