O arquivo AndroidManifest.xml é um elemento indispensável em qualquer projeto Android. Ele atua como um descritor global, fornecendo ao sistema operacional informações essenciais sobre a estrutura e os requisitos da aplicação. Sem este arquivo, o sistema Android não consegue identificar os componentes do app ou as permissões necessárias para sua execução.
As principais responsabilidades do AndroidManifest.xml incluem:
- Definição do pacote da aplicação (Package Name), que serve como identificador exclusivo.
- Declaração dos componentes fundamentais: Activities, Services, Broadcast Receivers e Content Providers.
- Especificação dos níveis de API compatíveis (minSdkVersion e targetSdkVersion).
- Listagem de permissões necessárias para acessar recursos do sistema (como câmera ou internet).
- Definição de metadados e filtros de Intent para comunicação entre aplicações.
Estrutura Básica e Declaração de Componentes
Abaixo, apresentamos um exemplo de configuração de um manifesto para uma aplicação que gerencia serviços em segundo plano e possui atividades específicas para inicialização:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.tech.solutions.inventory"
android:versionCode="10"
android:versionName="1.2.0" >
<uses-sdk
android:minSdkVersion="21"
android:targetSdkVersion="33" />
<!-- Requisição de permissões de rede e sistema -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:name=".BaseApplication"
android:allowBackup="false"
android:icon="@mipmap/ic_app_launcher"
android:label="@string/app_label"
android:theme="@style/Theme.MainDesign" >
<!-- Configuração de API Key para serviços externos -->
<meta-data
android:name="com.external.service.API_KEY"
android:value="ABC123XYZ789" />
<!-- Declaração de um Serviço de sincronização -->
<service
android:name=".network.SyncDataService"
android:exported="false">
<intent-filter>
<action android:name="com.tech.solutions.ACTION_SYNC" />
</intent-filter>
</service>
<!-- Atividade de Entrada (Splash Screen) -->
<activity
android:name=".ui.GatewayActivity"
android:screenOrientation="portrait"
android:theme="@style/Theme.Splash">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- Atividade de Login com ajuste de teclado -->
<activity
android:name=".ui.AuthActivity"
android:windowSoftInputMode="adjustResize"
android:screenOrientation="portrait" />
</application>
</manifest>
Gerenciamento de Serviços (Services)
No exemplo acima, o SyncDataService é uma classe que estende a classe base Service. Em uma implementação real, o desenvolvedor deve sobrescrever métodos como onCreate(), onStartCommand() e onDestroy() para gerenciar o ciclo de vida. Para eniciar o serviço a partir de outro componente, utiliza-se uma Intent:
Intent syncIntent = new Intent(context, SyncDataService.class);
syncIntent.setAction("com.tech.solutions.ACTION_SYNC");
syncIntent.putExtra("priority_level", 5);
context.startService(syncIntent);
Invocação de Componentes via Intent Filter
Quando uma Activity é declarada com categorias específicas ou esquemas de dados, ela pode ser invocada por outras aplicações ou processos internos através de ações personalizadas. No exemplo abaixo, vemos como disparar uma atividade usando parâmetros extras:
Intent navIntent = new Intent("com.tech.solutions.OPEN_DASHBOARD");
navIntent.setData(Uri.parse("app://dashboard/main"));
navIntent.putExtra("user_token", "session_001");
navIntent.putExtra("refresh_needed", true);
if (navIntent.resolveActivity(getPackageManager()) != null) {
startActivity(navIntent);
}
Broacdast Receivers e Comunicação de Eventos
O BroadcastReceiver permite que o aplicativo responda a mensagens de broadcast enviadas pelo sistema ou por outras aplicações. Ele deve ser registrado no manifesto para que o Android saiba quando ativá-lo, mesmo que o app não esteja em execução.
<receiver android:name=".receivers.EventMonitorReceiver">
<intent-filter>
<action android:name="com.tech.solutions.EVENT_UPDATE" />
</intent-filter>
</receiver>
Para enviar um sinal para o EventMonitorReceiver e processar uma lógica específica (como atualizar um banco de dados local ou notificar o usuário), o código seria o seguinte:
Intent broadcastIntent = new Intent("com.tech.solutions.EVENT_UPDATE");
broadcastIntent.putExtra("payload_id", 1024);
broadcastIntent.putExtra("status", "completed");
sendBroadcast(broadcastIntent);
Ao receber este broadcast, o método onReceive(Context context, Intent intent) da classe EventMonitorReceiver será executado, permitindo que a aplicação tome decisões baseadas nos dados recebidos no intent.