Utilisation du manifeste Android
AndroidManifest.xml est un fichier puissant dans la plateforme Android qui vous permet de décrire les fonctionnalités et les exigences de votre application sur Android. Cependant, il n’est pas facile d’y travailler. Xamarin.Android permet de réduire cette difficulté en vous permettant d’ajouter des attributs personnalisés à vos classes, qui seront ensuite utilisés pour générer automatiquement le manifeste pour vous. Notre objectif est que 99 % de nos utilisateurs n’ont jamais besoin de modifier manuellement AndroidManifest.xml.
AndroidManifest.xml est généré dans le cadre du processus de génération, et le code XML trouvé dans Properties/AndroidManifest.xml est fusionné avec le XML généré à partir d’attributs personnalisés. Le AndroidManifest.xml fusionné résultant réside dans le sous-répertoire obj ; par exemple, il réside dans obj/Debug/android/AndroidManifest.xml pour les builds Debug. Le processus de fusion est trivial : il utilise des attributs personnalisés dans le code pour générer des éléments XML et insère ces éléments dans AndroidManifest.xml.
Concepts de base
Au moment de la compilation, les assemblys sont analysés pour rechercher des classes non-quiabstract
dérivent de l’activité et dont l’attribut [Activity]
est déclaré. Il utilise ensuite ces classes et attributs pour générer le manifeste. Considérons par exemple le code suivant :
namespace Demo
{
public class MyActivity : Activity
{
}
}
Ainsi, rien n’est généré dans AndroidManifest.xml. Si vous souhaitez générer un <activity/>
élément, vous devez utiliser le[Activity]
attribut personnalisé :
namespace Demo
{
[Activity]
public class MyActivity : Activity
{
}
}
Cet exemple entraîne l’ajout du fragment xml suivant à AndroidManifest.xml:
<activity android:name="md5a7a3c803e481ad8926683588c7e9031b.MainActivity" />
L’attribut [Activity]
n’a aucun effet sur les abstract
types ; abstract
les types sont ignorés.
Nom de l’activité
À compter de Xamarin.Android 5.1, le nom de type d’une activité est basé sur le MD5SUM du nom qualifié d’assembly du type exporté. Cela permet de fournir le même nom complet à partir de deux assemblys différents et de ne pas obtenir d’erreur d’empaquetage. (Avant Xamarin.Android 5.1, le nom de type par défaut de l’activité a été créé à partir de l’espace de noms en minuscules et du nom de la classe.)
Si vous souhaitez remplacer cette valeur par défaut et spécifier explicitement le nom de votre activité, utilisez la Name
propriété :
[Activity (Name="awesome.demo.activity")]
public class MyActivity : Activity
{
}
Cet exemple produit le fragment xml suivant :
<activity android:name="awesome.demo.activity" />
Notes
Vous devez utiliser la Name
propriété uniquement pour des raisons de compatibilité descendante, car ce changement de nom peut ralentir la recherche de type au moment de l’exécution. Si vous disposez d’un code hérité qui s’attend à ce que le nom de type par défaut de l’activité soit basé sur l’espace de noms en minuscules et le nom de la classe, consultez Nommage wrapper callable Android pour obtenir des conseils sur le maintien de la compatibilité.
Barre de titre de l’activité
Par défaut, Android donne à votre application une barre de titre lorsqu’elle est exécutée.
La valeur utilisée pour cela est /manifest/application/activity/@android:label
.
Dans la plupart des cas, cette valeur diffère du nom de votre classe. Pour spécifier l’étiquette de votre application dans la barre de titre, utilisez la Label
propriété .
Par exemple :
[Activity (Label="Awesome Demo App")]
public class MyActivity : Activity
{
}
Cet exemple produit le fragment xml suivant :
<activity android:label="Awesome Demo App"
android:name="md5a7a3c803e481ad8926683588c7e9031b.MainActivity" />
Lancement à partir du sélecteur d’applications
Par défaut, votre activité ne s’affiche pas dans l’écran du lanceur d’applications Android. Cela est dû au fait qu’il y aura probablement de nombreuses activités dans votre application et que vous ne souhaitez pas d’icône pour chacune d’elles. Pour spécifier lequel doit être lancé à partir du lanceur d’applications, utilisez la MainLauncher
propriété . Par exemple :
[Activity (Label="Awesome Demo App", MainLauncher=true)]
public class MyActivity : Activity
{
}
Cet exemple produit le fragment xml suivant :
<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>
Icône d’activité
Par défaut, votre activité reçoit l’icône de lanceur par défaut fournie par le système. Pour utiliser une icône personnalisée, ajoutez d’abord votre .png à Ressources/dessinables, définissez son action de génération sur AndroidResource, puis utilisez la Icon
propriété pour spécifier l’icône à utiliser. Par exemple :
[Activity (Label="Awesome Demo App", MainLauncher=true, Icon="@drawable/myicon")]
public class MyActivity : Activity
{
}
Cet exemple produit le fragment xml suivant :
<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>
Autorisations
Lorsque vous ajoutez des autorisations au manifeste Android (comme décrit dans Ajouter des autorisations au manifeste Android), ces autorisations sont enregistrées dans Propriétés/AndroidManifest.xml.
Par exemple, si vous définissez l’autorisation INTERNET
, l’élément suivant est ajouté à Properties/AndroidManifest.xml:
<uses-permission android:name="android.permission.INTERNET" />
Les builds de débogage définissent automatiquement certaines autorisations pour faciliter le débogage (par INTERNET
exemple, et READ_EXTERNAL_STORAGE
) : ces paramètres sont définis uniquement dans le obj/Debug/android/AndroidManifest.xml généré et ne sont pas affichés comme activés dans les paramètres Autorisations requises .
Par exemple, si vous examinez le fichier manifeste généré dans obj/Debug/android/AndroidManifest.xml, vous pouvez voir les éléments d’autorisation ajoutés suivants :
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Dans la version de build Release du manifeste (sur obj/Debug/android/AndroidManifest.xml), ces autorisations ne sont pas configurées automatiquement. Si vous constatez que le passage à une build Release entraîne la perte d’une autorisation qui était disponible dans la build Debug, vérifiez que vous avez explicitement défini cette autorisation dans les paramètres Autorisations requises pour votre application (voir Générer une > application Android dans Visual Studio pour Mac ; voir Propriétés > manifeste Android dans Visual Studio).
Fonctionnalités avancées
Actions et fonctionnalités d’intention
Le manifeste Android vous permet de décrire les fonctionnalités de votre activité. Cela s’effectue par le biais des intentions et du[IntentFilter]
attribut personnalisé. Vous pouvez spécifier les actions appropriées pour votre activité à l’aide deIntentFilter
constructeur, et quelles catégories sont appropriées avec lePropriété Categories
. Au moins une activité doit être fournie (c’est pourquoi les activités sont fournies dans le constructeur). [IntentFilter]
peut être fourni plusieurs fois, et chaque utilisation entraîne un élément distinct <intent-filter/>
dans le <activity/>
. Par exemple :
[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
{
}
Cet exemple produit le fragment xml suivant :
<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>
Élément d’application
Le manifeste Android vous permet également de déclarer des propriétés pour l’ensemble de votre application. Cela s’effectue via l’élément <application>
et son équivalent, l’attribut personnalisé Application . Notez qu’il s’agit de paramètres à l’échelle de l’application (à l’échelle de l’assembly) plutôt que de paramètres par activité. En règle générale, vous déclarez <application>
des propriétés pour l’ensemble de votre application, puis remplacez ces paramètres (selon les besoins) par activité.
Par exemple, l’attribut suivant Application
est ajouté à AssemblyInfo.cs pour indiquer que l’application peut être déboguée, que son nom lisible par l’utilisateur est My App et qu’elle utilise le Theme.Light
style comme thème par défaut pour toutes les activités :
[assembly: Application (Debuggable=true,
Label="My App",
Theme="@android:style/Theme.Light")]
Cette déclaration génère le fragment XML suivant dans obj/Debug/android/AndroidManifest.xml:
<application android:label="My App"
android:debuggable="true"
android:theme="@android:style/Theme.Light"
... />
Dans cet exemple, toutes les activités de l’application seront par défaut au Theme.Light
style. Si vous définissez le thème d’une activité sur Theme.Dialog
, seule cette activité utilisera le Theme.Dialog
style, tandis que toutes les autres activités de votre application seront par défaut le Theme.Light
style défini dans l’élément <application>
.
L’élément Application
n’est pas la seule façon de configurer <application>
des attributs. Vous pouvez également insérer des attributs directement dans l’élément <application>
De propriétés/AndroidManifest.xml. Ces paramètres sont fusionnés dans l’élément final <application>
qui réside dans obj/Debug/android/AndroidManifest.xml. Notez que le contenu de Propriétés/AndroidManifest.xml toujours remplacer les données fournies par les attributs personnalisés.
Il existe de nombreux attributs à l’échelle de l’application que vous pouvez configurer dans l’élément <application>
; pour plus d’informations sur ces paramètres, consultez la section Propriétés publiques de ApplicationAttribute.
Liste des attributs personnalisés
- Android.App.ActivityAttribute : génère un fragment XML /manifest/application/activity
- Android.App.ApplicationAttribute : génère un fragment XML /manifest/application
- Android.App.InstrumentationAttribute : génère un fragment XML /manifest/instrumentation
- Android.App.IntentFilterAttribute : génère un fragment XML //intent-filter
- Android.App.MetaDataAttribute : génère un fragment XML //meta-data
- Android.App.PermissionAttribute : génère un fragment XML //permission
- Android.App.PermissionGroupAttribute : génère un fragment XML //permission-group
- Android.App.PermissionTreeAttribute : génère un fragment XML //permission-tree
- Android.App.ServiceAttribute : génère un fragment XML /manifest/application/service
- Android.App.UsesLibraryAttribute : génère un fragment XML /manifest/application/uses-library
- Android.App.UsesPermissionAttribute : génère un fragment XML /manifest/uses-permission
- Android.Content.BroadcastReceiverAttribute : génère un fragment XML /manifest/application/receiver
- Android.Content.ContentProviderAttribute : génère un fragment XML /manifest/application/provider
- Android.Content.GrantUriPermissionAttribute : génère un fragment XML /manifest/application/provider/grant-uri-permission