Este artigo faz parte de uma série sobre desenvolvimento Android. Os dois primeiros artigos são Configurando o ambiente de desenvolvimento e Novo projeto e emulador no Android Studio.
Hoje, vamos criar a nossa primeira Activity, entender o que ela é e como funciona, além de mostrar uma noção geral sobre Intents. Vamos lá?
Vamos criar um projeto que será evoluído nos próximos artigos. Para isso, crie um novo projeto seguindo o tutorial anterior (fizemos um Hello World), com a diferença de que, em vez de selecionar Empty Activity, selecione a opção Add No Activity. Assim, podemos controlar melhor o que é criado e entender o que está acontecendo.
Algumas configurações iniciais serão realizadas e um modelo básico de projeto será criado. A princípio, não se preocupe; vamos focar nos pontos um a um ao longo desta série. Assim que o projeto é criado, você verá à esquerda da IDE, na árvore do projeto, as opções app e Gradle Scripts. Isso ocorre porque estamos utilizando a visão Android, que agrupa muitas coisas e mostra os arquivos de uma forma mais significativa para Android. Ok, um pouco de mágica e esses “açúcares” são bons, mas no início, quando estamos entendendo o que de fato está acontecendo, é melhor ver as coisas na sua forma mais crua, para que a mágica deixe de ser mágica. Sempre que tiver algo “mágico”, vamos trabalhar pra entender como a mágica é feita. Quebra um pouco o encanto, mas te possibilita fazer suas próprias mágicas depois.
Vamos, então, mudar a visão de Android para Project, que exibirá a estrutura real de pastas do projeto.
Vamos navegar, então, até a pasta java no caminho app/src/main/java. O caminho para a pasta tem este formato por causa da estrutura de um projeto Gradle, uma ferramenta bastante popular que nos ajuda a gerenciar todo o ciclo de build do projeto, incluindo suas dependências e a orquestração das ferramentas de compilação e tooling em geral. Em um momento oportuno, vamos analisar o Gradle mais a fundo. Nesta pasta, você pode ver, por enquanto, apenas a declaração do pacote do aplicativo.
Vamos criar a nossa primeira Activity. Clique com o botão direito sobre o pacote (no meu caso, net.rafaeltoledo.tutorial) e selecionar a opção New -> Java Class e nomear a classe a ser criada de MainActivity.
Activities no Android são a representação de uma tela. É por meio dela que o conteúdo das telas é exibido e as interações de interface são executadas. Dentre os principais componentes do Android, é o que corresponde à UI dos aplicativos.
Para que esta classe se torne uma Activity, ela deve estender da classe Activity do Android. Porém, para o nosso caso, vamos fazer a nossa classe estender AppCompatActivity. Por quê? A AppCompatActivity é uma versão da Activity que garante um comportamento uniforme a partir da versão 7 (2.1) do Android. Essa classe faz parte das bibliotecas de suporte, que vamos conhecer e entender mais a fundo em um artigo futuro.
Para que a nossa Activity esteja disponível no launcher do dispositivo, na forma de um ícone na lista de aplicativos, precisamos configurar o nosso Android Manifest, um arquivo que corresponde a uma espécie de índice do nosso aplicativo. Nele é que serão descritas, dentre outras informações, quais Activities nosso aplicativo possui e quais permissões ele necessita para ser executado.
No caso, como não selecionamos a criação automática da Activity quando criamos o projeto, temos apenas a descrição básica do nosso aplicativo no arquivo AndroidManifest.xml, localizado na pasta app/src/main (pode ter pequenas diferenças, dependendo da versão do Android Studio que você estiver usando):
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="net.rafaeltoledo.tutorial"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> </application> </manifest>
Basicamente, temos aqui duas informações importantes:
- A declaração do nó principal manifest com o atributo package. Esse atributo é importante, pois ele indica em qual pacote Java está a classe R. Esta classe, gerada automaticamente a cada compilação, é um índice com todos os recursos do nosso aplicativo que não são códigos Java. Veremos recursos muito em breve.
- A declaração do nó application, que configura e descreve o nosso aplicativo. Dentre as informações principais, temos aqui o ícone, o label (que será o nome do aplicativo no launcher do sistema) e o tema.
Para adicionarmos a nossa Activity, vamos colocar um novo nó dentro do nó application, dessa forma:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="net.rafaeltoledo.tutorial"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Neste nó, estamos adicionando uma Activity com o nome .MainActivity. Este caminho pode ser absoluto (net.rafaeltoledo.tutorial.MainActivity) ou, como é o caso, relativo ao package que temos na raiz do manifesto. Perceba que temos também uma configuração dentro do nó activity, chamada de intent-filter.
O Android possui um mecanismo de troca de mensagens conhecido como intents. Uma intent indica a intenção de se fazer alguma coisa, seja enviar uma mensagem para um componente ou iniciar um deles. Essa intent pode conter diversas informações, como o destinatário, uma ação (action), uma categoria (category) e outras várias informações extras.
Lembra que quase toda aplicação que a gente escreve em qualquer linguagem sempre começa com um método main()? A ideia é parecida aqui: quando o ícone do aplicativo no launcher é tocado, é disparada uma Intent para a Activity configurada, com a categoria android.intent.category.LAUNCHER e a ação android.intent.action.MAIN, indicando que o aplicativo foi iniciado a partir do launcher do sistema. Existem, inclusive, aplicativos que possuem mais de um ícone na lista de apps do launcher.
Para vermos isso acontecendo na prática, vamos ver esse Intent chegando para a nossa Activity. Para isso, vamos sobrescrever o método onCreate() da nossa Activity MainActivity. Como estendemos de AppCompatActivity, herdamos vários métodos que nos permitem fazer diversas coisas no Android. O método onCreate() é um dos callbacks do ciclo de vida de uma Activity. Como você pode perceber, não chamamos o construtor da Activity diretamente, quem faz esse gerenciamento é o próprio Android. Então, somos apenas notificados quando cada coisa acontece. Você pode ver o ciclo de vida da Activity completo aqui, mas não se preocupe muito com isso por enquanto. Cada um desses estados vai fazer sentido mais adiante.
No método onCreate(), vamos, então, pegar as informações que vieram da Intent que dispararam a nossa Activity. Para isso, vamos escrever no log do Android (conhecido como LogCat) algumas informações da Intent, como a ação, a categoria e o componente que foi lançado. O código fica assim:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intent = getIntent(); Log.d("MA::Action", intent.getAction()); for (String category : intent.getCategories()) { Log.d("MA::Category", category); } Log.d("MA::Component", intent.getComponent().getClassName()); } }
Repare que para exibir informação no Logcat, em vez do padrão System.out, do Java, utilizamos a classe Log, do Android. Com essa classe, temos melhores mecanismos para controlar o nível do log (error, warning, debug etc) e podemos adicionar uma tag (primeiro parâmetro) para que fique mais fácil de encontrar o que queremos.
Agora, se você executar o aplicativo e clicar na aba Android Monitor (na parte inferior do Android Studio), poderá conferir o log do seu aplicativo, exibindo as informações da Intent:
E por hoje é só! No próximo artigo vamos entender melhor os resources do Android e criar nosso primeiro layout para a MainActivity! Ah, sim, o projeto completo desenvolvido até aqui pode ser encontrado no Github!
Ficou alguma dúvida ou tem alguma contribuição? Aproveite os campos abaixo!
***
Artigo publicado originalmente em: https://www.concretesolutions.com.br/2017/04/10/activities-intents-android/