No Android, Intents são uma forma de comunicação entre diferentes componentes do sistema e entre aplicativos. Elas permitem que uma aplicação solicite uma ação de outra aplicação, como abrir uma página web, enviar um e-mail ou iniciar uma nova atividade dentro do mesmo aplicativo. Intents podem ser explícitas, quando o componente alvo é especificado, ou implícitas, quando o sistema decide qual componente deve responder baseado nas informações fornecidas na Intent.
Facilidade de uso
Intents facilitam a comunicação entre diferentes componentes de um aplicativo ou entre aplicativos distintos. Isso é crucial para o funcionamento de aplicativos modernos, onde a integração entre diferentes serviços e funcionalidades é necessária para oferecer uma experiência de usuário rica e coesa.
Conceito: Intents permitem que componentes como atividades, serviços e broadcast receivers se comuniquem entre si. Quando um componente quer iniciar outro componente, ele pode criar uma Intent descrevendo a ação desejada (por exemplo, visualizar uma foto, enviar uma mensagem, etc.) e enviá-la ao sistema Android, que determina o componente adequado para lidar com a Intent.
No mundo da automação comercial por exemplo, você já deve ter notado que podemos e até somos obrigados a chamar outros aplicativos para realizar tarefas pra nós, por exemplo aplicativos que precisam receber valores por débito e crédito. Normalmente uma maquinha de cartão com Android, os famosos POS, vem instalados aplicativos das empresas que farão o recebimento do pagamento. Esses apps recebem as requisições através de Intents, recebem o pagamento e devolvem a instrução para o aplicativo chamador. Isso é só pra você ter uma ideia de como funciona.
Exemplo prático:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
uses Androidapi.Helpers, Androidapi.JNI.GraphicsContentViewText; procedure ShareText(const Text: string); var Intent: JIntent; begin Intent := TJIntent.Create; Intent.setAction(TJIntent.JavaClass.ACTION_SEND); Intent.setType(StringToJString('text/plain')); Intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString(Text)); TAndroidHelper.Activity.startActivity(TJIntent.JavaClass.createChooser(Intent, StrToJCharSequence('Compartilhar via'))); end; // Exemplo de uso ShareText('Olá, este é um texto para compartilhar!'); |
No código acima, estamos criando um método chamado ShareTExt que fará o trabalho de enviar um texto para o sistema operacional Android. Nesse caso em especial, o Android carregará uma popup na parte inferior onde o usuáro deverá escolher para qual o aplicativo esse texto será enviado.
Além disso, podemos tanto usar Intents para enviar algo a outro aplicativo quando receber esses “comandos” em nosso app para realizar alguma tarefa. Veremos ambas opções.
Reuso de componentes
Usar Intents permite que aplicativos reutilizem funcionalidades de outros aplicativos, economizando tempo e esforço no desenvolvimento de funcionalidades que já existem e são bem implementadas por outros.
Exemplo Prático: Capturar Foto
Ao invés de implementar uma câmera completa dentro do seu aplicativo, você pode usar uma Intent para solicitar que o aplicativo de câmera nativo do dispositivo capture uma foto e retorne a imagem capturada.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
uses Androidapi.Helpers, Androidapi.JNI.GraphicsContentViewText, FMX.Helpers.Android; const REQUEST_IMAGE_CAPTURE = 1; procedure CapturePhoto; var Intent: JIntent; begin Intent := TJIntent.JavaClass.init(TJMediaStore.JavaClass.ACTION_IMAGE_CAPTURE); if Intent.resolveActivity(TAndroidHelper.Context.getPackageManager) <> nil then begin TAndroidHelper.Activity.startActivityForResult(Intent, REQUEST_IMAGE_CAPTURE); end; end; procedure TForm1.onActivityResult(RequestCode: Integer; ResultCode: Integer; Data: JIntent); begin if (RequestCode = REQUEST_IMAGE_CAPTURE) and (ResultCode = TJActivity.JavaClass.RESULT_OK) then begin // Tratar a foto capturada (data.getExtras.get('data') contém a imagem) end; end; // Exemplo de uso CapturePhoto; |
Modularidade
Intents promovem um design modular, onde diferentes partes do aplicativo podem ser desenvolvidas e testadas separadamente. Isso leva a um código mais limpo e fácil de manter.
Conceito: Ao usar Intents para separar funcionalidades em diferentes atividades ou serviços, você garante que cada componente do seu aplicativo tenha uma única responsabilidade. Isso facilita a depuração, o teste e a manutenção do aplicativo a longo prazo.
Exemplo Prático: Iniciar uma nova atividade
Você pode usar uma Intent explícita para iniciar uma nova atividade dentro do seu aplicativo, promovendo a modularidade do código.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
uses Androidapi.Helpers, Androidapi.JNI.GraphicsContentViewText; procedure StartNewActivity; var Intent: JIntent; begin Intent := TJIntent.JavaClass.init(TAndroidHelper.Context, TNewActivity.JavaClass); TAndroidHelper.Activity.startActivity(Intent); end; // Exemplo de uso StartNewActivity; |
Flexibilidade
Intents permitem que aplicativos realizem uma ampla gama de ações, desde abrir páginas web até enviar emails e mensagens SMS. Isso oferece uma grande flexibilidade no design de funcionalidades do aplicativo.
Conceito: A flexibilidade das Intents permite que você adicione novas funcionalidades ao seu aplicativo com pouco esforço, aproveitando ao máximo as capacidades do dispositivo e do ecossistema Android.
Exemplo Prático: Enviar um Email
Você pode usar uma Intent para permitir que o usuário envie um email usando qualquer aplicativo de email instalado no dispositivo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
uses Androidapi.Helpers, Androidapi.JNI.GraphicsContentViewText; procedure SendEmail(const Recipient, Subject, Body: string); var Intent: JIntent; begin Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_SEND); Intent.setType(StringToJString('message/rfc822')); Intent.putExtra(TJIntent.JavaClass.EXTRA_EMAIL, StringToJStringArray([Recipient])); Intent.putExtra(TJIntent.JavaClass.EXTRA_SUBJECT, StringToJString(Subject)); Intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString(Body)); TAndroidHelper.Activity.startActivity(TJIntent.JavaClass.createChooser(Intent, StrToJCharSequence('Enviar Email via'))); end; // Exemplo de uso SendEmail('exemplo@dominio.com', 'Assunto do Email', 'Corpo do email.'); |
Obs. Os exemplos de código acima podem variar um pouco em cada versão do Delphi e/ou Android, mas as variações são mais raras, o Google tem isso muito bem desenvolvido no Android.
É possível criar um app que receba Intents?
Sim, é totalmente possível criar um aplicativo em Delphi que receba Intents. Para isso, é necessário declarar no arquivo de manifesto do aplicativo quais Intents ele está preparado para receber e implementar o tratamento dessas Intents no código do aplicativo.
Quais são os tipos de Intents que podemos integrar?
Podemos integrar diversos tipos de Intents, incluindo:
- Intents Implícitas: Para ações como compartilhar texto, abrir URLs, enviar emails, etc.
- Intents Explícitas: Para iniciar atividades ou serviços específicos dentro do mesmo aplicativo.
- Broadcast Intents: Para receber notificações do sistema ou de outros aplicativos, como alterações na conectividade de rede ou na bateria.
Tipos de Intents no Android
1. Intents Implícitas
Intents Implícitas são usadas quando você deseja realizar uma ação sem especificar o componente exato que deve executá-la. Em vez disso, você fornece informações suficientes para que o sistema Android encontre o componente apropriado. Isso é útil quando você quer que o sistema escolha o melhor aplicativo para a tarefa, como abrir uma página web ou compartilhar texto.
Características:
- Não especifica diretamente o componente que deve tratar a Intent.
- Usa ações genéricas como
ACTION_VIEW
,ACTION_SEND
, etc. - Permite que o usuário escolha entre várias opções se houver mais de um aplicativo que possa realizar a ação.
Exemplo Prático: Abrir uma Página Web
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
uses Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers, FMX.Helpers.Android; procedure OpenWebPage(const URL: string); var Intent: JIntent; begin Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW, TJnet_Uri.JavaClass.parse(StringToJString(URL))); TAndroidHelper.Activity.startActivity(Intent); end; // Exemplo de uso OpenWebPage('https://www.example.com'); |
Neste exemplo, a Intent não especifica qual navegador deve ser usado para abrir a URL. O sistema apresentará uma lista de navegadores disponíveis e deixará o usuário escolher.
2. Intents Explícitas
Intents Explícitas são usadas quando você sabe exatamente qual componente deve tratar a Intent. Isso é comum quando você está comunicando entre diferentes atividades dentro do mesmo aplicativo. Aqui, você especifica diretamente a classe do componente que deve responder à Intent.
Características:
- Especifica diretamente o componente alvo.
- Usada principalmente para comunicação dentro do mesmo aplicativo.
- Garante que a ação seja tratada pelo componente especificado.
Exemplo Prático: Iniciar uma Nova Atividade
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
uses Androidapi.Helpers, Androidapi.JNI.GraphicsContentViewText; procedure StartNewActivity; var Intent: JIntent; begin Intent := TJIntent.JavaClass.init(TAndroidHelper.Context, TNewActivity.JavaClass); TAndroidHelper.Activity.startActivity(Intent); end; // Exemplo de uso StartNewActivity; |
Neste exemplo, a Intent especifica que a TNewActivity
deve ser iniciada, garantindo que a ação será tratada pela atividade especificada.
3. Broadcast Intents
Broadcast Intents são usadas para enviar eventos para múltiplos componentes do sistema ou de aplicativos. Existem dois tipos principais de broadcasts: sistemáticos (enviados pelo sistema) e customizados (enviados pelos aplicativos). Componentes chamados Broadcast Receivers são usados para receber e tratar esses eventos.
Características:
- Pode ser enviado para múltiplos receptores.
- Usado para eventos do sistema como mudanças na conectividade, bateria fraca, etc.
- Pode ser registrado dinamicamente no código ou estaticamente no manifesto do aplicativo.
Exemplo Prático: Receber Alterações na Conectividade de Rede
Primeiro, registre um BroadcastReceiver no manifesto do aplicativo para receber alterações na conectividade:
1 2 3 4 5 6 7 |
<receiver android:name=".NetworkChangeReceiver"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> </intent-filter> </receiver> |
Depois, implemente o BroadcastReceiver
em Delphi:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
uses Androidapi.JNIBridge, Androidapi.JNI.JavaTypes, Androidapi.JNI.GraphicsContentViewText, FMX.Helpers.Android; type TNetworkChangeReceiver = class(TJavaLocal, JBroadcastReceiver) public procedure onReceive(Context: JContext; Intent: JIntent); cdecl; end; procedure TNetworkChangeReceiver.onReceive(Context: JContext; Intent: JIntent); begin if Intent.getAction.equals(TJConnectivityManager.JavaClass.CONNECTIVITY_ACTION) then begin // Tratar a mudança na conectividade ShowMessage('A conectividade de rede mudou'); end; end; // Registro do Receiver dinamicamente no código (opcional, se não registrado no manifesto) var Receiver: TNetworkChangeReceiver; begin Receiver := TNetworkChangeReceiver.Create; TAndroidHelper.Context.registerReceiver(Receiver, TJIntentFilter.JavaClass.init(TJConnectivityManager.JavaClass.CONNECTIVITY_ACTION)); end; |
Hoje o artigo foi mais teórico, deixe nos comentários desse artigo se deseja que façamos algo mais detalhado, com exemplos mais práticos do dia a dia e se deseja um vídeo ou live onde possamos ver tudo funcionando.
Recomendo que assista ao vídeo do nosso amigo Landerson Gomes.
Conclusão
Os diferentes tipos de Intents no Android permitem que os aplicativos se comuniquem e interajam de maneiras flexíveis e poderosas. Intents Implícitas permitem ações gerais onde o sistema escolhe o melhor componente para responder. Intents Explícitas são usadas para comunicação direta entre componentes específicos. Broadcast Intents permitem a disseminação de eventos para múltiplos receptores, possibilitando reações a mudanças no sistema ou outras ações específicas. Compreender e utilizar esses tipos de Intents efetivamente pode melhorar significativamente a funcionalidade e a integração dos aplicativos Android desenvolvidos com Delphi.
Comunidade no Telegram
🚀Comente no campo abaixo 👇👇👇 o que achou e qual sua dúvida.
Te vejo na próxima
Adriano Santos