StartActivityForResult está obsoleto!
Avalie esse Artigo
O Android tem estado na borda da evolução por um tempo recentemente, com atualizações para
androidx.activity:activity-ktx
para 1.2.0
. Ele depreciou startActivityForResult
em favor de registerForActivityResult
.Foi um dos primeiros fundamentos que qualquer desenvolvedor Android aprendeu e a espinha dorsal da maneira de comunicação do Android entre dois componentes. O design da API era simples o suficiente para ser iniciado rapidamente, mas tinha seus contras, como a dificuldade de encontrar o chamador em aplicativos do mundo real (exceto cmd+F no projeto 😂), obter resultados no fragmento, resultados perdidos se o componente é recriado, entra em conflito com o mesmo código de solicitação, etc.
Vamos tentar entender como usar a nova API com alguns exemplos.
Antiga escola:
Novo Caminho:
Como você deve ter notado,
registerForActivityResult
utiliza dois parâmetros. O primeiro define o tipo de ação/interação necessária (ActivityResultContracts
) e o segundo é uma função de chamada de resposta onde obtemos o resultado.Não mudou muito, não é mesmo? Vamos verificar outro exemplo.
O snippet acima é o código completo que obtém uma imagem de visualização da câmera. Não há necessidade de código de solicitação de permissão, pois isso é feito automaticamente para nós!
Outro benefício de usar a nova API é que ela força os desenvolvedores a usar o contrato correto. Por exemplo, com
ActivityResultContracts.TakePicture()
— que retorna a imagem completa — você precisa passar um URI
como parâmetro para launch
, o que reduz o tempo de desenvolvimento e a chance de erros.Esse foi outro problema com o sistema antigo, sem nenhuma implementação limpa disponível, mas a nova API funciona de forma consistente em atividades e fragmentos. Portanto, referenciamos e adicionamos o trecho do exemplo 1 aos nossos fragmentos.
Maneira antiga: .
Com a nova API, isso é possível usando
ActivityResultRegistry
diretamente.Encontrei registrarForActivityResult útil e limpo. Alguns dos prós, na minha opinião, são:
- Melhore a legibilidade do código, não é necessário lembrar de pular para
onActivityResult()
depoisstartActivityForResult
. ActivityResultLauncher
retornou doregisterForActivityResult
usado para iniciar componentes, definindo explicitamente o parâmetro de entrada para os resultados desejados.- Foi removido o código padrão para solicitar permissão do usuário.
Espero que isso tenha sido informativo e tenha gostado de lê-lo.