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 …