Trabalhando com o manifesto do Android

AndroidManifest.xml é um arquivo avançado na plataforma Android que permite descrever a funcionalidade e os requisitos do aplicativo para Android. No entanto, trabalhar com ele não é fácil. O Xamarin.Android ajuda a minimizar essa dificuldade, permitindo que você adicione atributos personalizados às suas classes, que serão usados para gerar automaticamente o manifesto para você. Nossa meta é que 99% de nossos usuários nunca precisem modificar manualmente AndroidManifest.xml.

AndroidManifest.xml é gerado como parte do processo de build e o XML encontrado em Propriedades/AndroidManifest.xml é mesclado com XML gerado a partir de atributos personalizados. O AndroidManifest.xml mesclado resultante reside no subdiretório obj ; por exemplo, ele reside em obj/Debug/android/AndroidManifest.xml para builds de depuração. O processo de mesclagem é trivial: ele usa atributos personalizados dentro do código para gerar elementos XML e insere esses elementos no AndroidManifest.xml.

Noções básicas

No tempo de compilação, os assemblies são verificados quantoabstract a classes não derivadas de Activity e têm o [Activity] atributo declarado neles. Em seguida, ele usa essas classes e atributos para criar o manifesto. Por exemplo, considere o seguinte código:

namespace Demo
{
    public class MyActivity : Activity
    {
    }
}

Isso resulta na geração de nada no AndroidManifest.xml. Se quiser que um <activity/> elemento seja gerado, você precisará usar o[Activity] atributo personalizado:

namespace Demo
{
    [Activity]
    public class MyActivity : Activity
    {
    }
}

Este exemplo faz com que o seguinte fragmento xml seja adicionado ao AndroidManifest.xml:

<activity android:name="md5a7a3c803e481ad8926683588c7e9031b.MainActivity" />

O [Activity] atributo não tem efeito sobre abstract tipos; abstract os tipos são ignorados.

Nome da atividade

A partir do Xamarin.Android 5.1, o nome do tipo de uma atividade é baseado no MD5SUM do nome qualificado por assembly do tipo que está sendo exportado. Isso permite que o mesmo nome totalmente qualificado seja fornecido de dois assemblies diferentes e não receba um erro de empacotamento. (Antes do Xamarin.Android 5.1, o nome de tipo padrão da atividade era criado com base no namespace em letras minúsculas e no nome da classe.)

Se você quiser substituir esse padrão e especificar explicitamente o nome da atividade, use a Name propriedade :

[Activity (Name="awesome.demo.activity")]
public class MyActivity : Activity
{
}

Este exemplo produz o seguinte fragmento xml:

<activity android:name="awesome.demo.activity" />

Observação

Você deve usar a Name propriedade apenas por motivos de compatibilidade com versões anteriores, pois essa renomeação pode retardar a pesquisa de tipo no runtime. Se você tiver um código herdado que espera que o nome de tipo padrão da atividade seja baseado no namespace em letras minúsculas e no nome da classe, consulte Nomeação de wrapper callable do Android para obter dicas sobre como manter a compatibilidade.

Barra de Título da Atividade

Por padrão, o Android fornece ao aplicativo uma barra de título quando ele é executado. O valor usado para isso é /manifest/application/activity/@android:label. Na maioria dos casos, esse valor será diferente do nome da classe. Para especificar o rótulo do aplicativo na barra de título, use a Label propriedade . Por exemplo:

[Activity (Label="Awesome Demo App")]
public class MyActivity : Activity
{
}

Este exemplo produz o seguinte fragmento xml:

<activity android:label="Awesome Demo App" 
          android:name="md5a7a3c803e481ad8926683588c7e9031b.MainActivity" />

Inicializável do Seletor de Aplicativos

Por padrão, sua atividade não aparecerá na tela inicializador de aplicativos do Android. Isso ocorre porque provavelmente haverá muitas atividades em seu aplicativo e você não quer um ícone para cada uma delas. Para especificar qual deve ser inicializável do inicializador de aplicativos, use a MainLauncher propriedade . Por exemplo:

[Activity (Label="Awesome Demo App", MainLauncher=true)] 
public class MyActivity : Activity
{
}

Este exemplo produz o seguinte fragmento xml:

<activity android:label="Awesome Demo App" 
          android:name="md5a7a3c803e481ad8926683588c7e9031b.MainActivity">
  <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
</activity>

Ícone de atividade

Por padrão, sua atividade receberá o ícone de inicializador padrão fornecido pelo sistema. Para usar um ícone personalizado, primeiro adicione seu .png a Recursos/desenhável, defina sua Ação de Build como AndroidResource e, em seguida, use a Icon propriedade para especificar o ícone a ser usado. Por exemplo:

[Activity (Label="Awesome Demo App", MainLauncher=true, Icon="@drawable/myicon")] 
public class MyActivity : Activity
{
}

Este exemplo produz o seguinte fragmento xml:

<activity android:icon="@drawable/myicon" android:label="Awesome Demo App" 
          android:name="md5a7a3c803e481ad8926683588c7e9031b.MainActivity">
  <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
</activity>

Permissões

Quando você adiciona permissões ao Manifesto do Android (conforme descrito em Adicionar Permissões ao Manifesto do Android), essas permissões são registradas em Propriedades/AndroidManifest.xml. Por exemplo, se você definir a INTERNET permissão, o seguinte elemento será adicionado a Properties/AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET" />

Os builds de depuração definem automaticamente algumas permissões para facilitar a depuração (como INTERNET e READ_EXTERNAL_STORAGE) – essas configurações são definidas apenas no obj/Debug/android/AndroidManifest.xml gerados e não são mostradas como habilitadas nas configurações de permissões necessárias .

Por exemplo, se você examinar o arquivo de manifesto gerado em obj/Debug/android/AndroidManifest.xml, poderá ver os seguintes elementos de permissão adicionados:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

Na versão de build de versão do manifesto (em obj/Debug/android/AndroidManifest.xml), essas permissões não são configuradas automaticamente. Se você achar que alternar para um build de versão faz com que seu aplicativo perca uma permissão que estava disponível no build de Depuração, verifique se você definiu explicitamente essa permissão nas configurações de permissões necessárias para seu aplicativo (consulte Compilar > aplicativo Android no Visual Studio para Mac; consulte Propriedades > manifesto do Android no Visual Studio).

Recursos avançados

Ações e recursos de intenção

O manifesto do Android fornece uma maneira de descrever os recursos de sua atividade. Isso é feito por meio de Intenções e do[IntentFilter] atributo personalizado. Você pode especificar quais ações são apropriadas para sua atividade com oIntentFilter construtor e quais categorias são apropriadas com oPropriedade Categories. Pelo menos uma atividade deve ser fornecida (e é por isso que as atividades são fornecidas no construtor). [IntentFilter] pode ser fornecido várias vezes e cada uso resulta em um elemento separado <intent-filter/> dentro do <activity/>. Por exemplo:

[Activity (Label="Awesome Demo App", MainLauncher=true, Icon="@drawable/myicon")] 
[IntentFilter (new[]{Intent.ActionView}, 
        Categories=new[]{Intent.CategorySampleCode, "my.custom.category"})]
public class MyActivity : Activity
{
}

Este exemplo produz o seguinte fragmento xml:

<activity android:icon="@drawable/myicon" android:label="Awesome Demo App" 
          android:name="md5a7a3c803e481ad8926683588c7e9031b.MainActivity">
  <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
  <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.SAMPLE_CODE" />
    <category android:name="my.custom.category" />
  </intent-filter>
</activity>

Elemento Application

O manifesto do Android também fornece uma maneira de declarar propriedades para todo o aplicativo. Isso é feito por meio do <application> elemento e de seu equivalente, o atributo personalizado Application . Observe que essas são configurações em todo o aplicativo (em todo o assembly) em vez de configurações por atividade. Normalmente, você declara <application> propriedades para todo o aplicativo e, em seguida, substitui essas configurações (conforme necessário) por atividade.

Por exemplo, o Application seguinte atributo é adicionado a AssemblyInfo.cs para indicar que o aplicativo pode ser depurado, que seu nome legível pelo usuário é Meu Aplicativo e que ele usa o Theme.Light estilo como o tema padrão para todas as atividades:

[assembly: Application (Debuggable=true,   
                        Label="My App",   
                        Theme="@android:style/Theme.Light")]

Essa declaração faz com que o seguinte fragmento XML seja gerado em obj/Debug/android/AndroidManifest.xml:

<application android:label="My App" 
             android:debuggable="true" 
             android:theme="@android:style/Theme.Light"
                ... />

Neste exemplo, todas as atividades no aplicativo usarão como padrão o Theme.Light estilo . Se você definir o tema Theme.Dialogde uma Atividade como , somente que Activity usará o Theme.Dialog estilo, enquanto todas as outras atividades em seu aplicativo usarão como padrão o Theme.Light estilo definido no <application> elemento .

O Application elemento não é a única maneira de configurar <application> atributos. Como alternativa, você pode inserir atributos diretamente no <application> elemento de Properties/AndroidManifest.xml. Essas configurações são mescladas no elemento final <application> que reside em obj/Debug/android/AndroidManifest.xml. Observe que o conteúdo de Propriedades/AndroidManifest.xml sempre substitui os dados fornecidos por atributos personalizados.

Há muitos atributos em todo o <application> aplicativo que você pode configurar no elemento ; para obter mais informações sobre essas configurações, consulte a seção Propriedades Públicas de ApplicationAttribute.

Lista de atributos personalizados