Trabajo con el manifiesto de Android
AndroidManifest.xml es un archivo eficaz en la plataforma Android que permite describir la funcionalidad y los requisitos de la aplicación en Android. Sin embargo, trabajar con él no es fácil. Xamarin.Android ayuda a minimizar esta dificultad, ya que permite agregar atributos personalizados a las clases, que luego se usarán para generar automáticamente el manifiesto. Nuestro objetivo es que el 99 % de nuestros usuarios nunca deba modificar manualmente AndroidManifest.xml.
AndroidManifest.xml se genera como parte del proceso de compilación y el XML que se encuentra en Propiedades/AndroidManifest.xml se combina con XML generado a partir de atributos personalizados. La combinación resultante AndroidManifest.xml reside en el subdirectorio obj; por ejemplo, reside en obj/Debug/android/AndroidManifest.xml compilaciones de depuración. El proceso de combinación es trivial: usa atributos personalizados dentro del código para generar elementos XML e inserta esos elementos en AndroidManifest.xml.
Conceptos básicos
En tiempo de compilación, los ensamblados se examinan en busca de clases que no son que se derivan de Activity y tienen el abstract atributo declarado en abstract[Activity] ellos. A continuación, usa estas clases y atributos para compilar el manifiesto. Por ejemplo, considere el siguiente código:
namespace Demo
{
public class MyActivity : Activity
{
}
}
Como resultado, no se genera nada enAndroidManifest.xml. Si desea que <activity/> se genere un elemento, debe usar el[Activity] atributo personalizado:
namespace Demo
{
[Activity]
public class MyActivity : Activity
{
}
}
En este ejemplo se agrega el siguiente fragmento xml a AndroidManifest.xml:
<activity android:name="md5a7a3c803e481ad8926683588c7e9031b.MainActivity" />
El [Activity] atributo no tiene ningún efecto en los abstract tipos; los tipos se abstract omiten.
Nombre de actividad
A partir de Xamarin.Android 5.1, el nombre de tipo de una actividad se basa en el MD5SUM del nombre calificado por el ensamblado del tipo que se va a exportar. Esto permite proporcionar el mismo nombre completo a partir de dos ensamblados diferentes y no obtener un error de empaquetado. (Antes de Xamarin.Android 5.1, el nombre de tipo predeterminado de la actividad se creó a partir del espacio de nombres con minúsculas y el nombre de clase).
Si desea invalidar este valor predeterminado y especificar explícitamente el nombre de la actividad, use la Name propiedad :
[Activity (Name="awesome.demo.activity")]
public class MyActivity : Activity
{
}
En este ejemplo se genera el siguiente fragmento xml:
<activity android:name="awesome.demo.activity" />
Nota:
Debe usar la propiedad solo por motivos de compatibilidad con versiones anteriores, ya que el cambio de nombre puede Name ralentizar la búsqueda de tipos en tiempo de ejecución. Si tiene código heredado que espera que el nombre de tipo predeterminado de la actividad se base en el espacio de nombres con minúsculas y el nombre de clase, consulte Nomenclatura de contenedor que se puede llamar de Android para obtener sugerencias sobre cómo mantener la compatibilidad.
Barra de título de actividad
De forma predeterminada, Android proporciona a la aplicación una barra de título cuando se ejecuta.
El valor utilizado para este es /manifest/application/activity/@android:label .
En la mayoría de los casos, este valor será diferente del nombre de la clase. Para especificar la etiqueta de la aplicación en la barra de título, use la Label propiedad .
Por ejemplo:
[Activity (Label="Awesome Demo App")]
public class MyActivity : Activity
{
}
En este ejemplo se genera el siguiente fragmento xml:
<activity android:label="Awesome Demo App"
android:name="md5a7a3c803e481ad8926683588c7e9031b.MainActivity" />
Se puede iniciar desde Application Chooser
De forma predeterminada, la actividad no se mostrará en la pantalla del iniciador de aplicaciones de Android. Esto se debe a que probablemente habrá muchas actividades en la aplicación y no desea un icono para cada una. Para especificar cuál debe iniciarse desde el iniciador de aplicaciones, use la MainLauncher propiedad . Por ejemplo:
[Activity (Label="Awesome Demo App", MainLauncher=true)]
public class MyActivity : Activity
{
}
En este ejemplo se genera el siguiente 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>
Icono de actividad
De forma predeterminada, la actividad recibirá el icono de iniciador predeterminado proporcionado por el sistema. Para usar un icono personalizado, agregue primero el.pnga Recursos/drawable,establezca su acción de compilación en AndroidResourcey, a continuación, use la propiedad para especificar el icono que se usará. Por ejemplo:
[Activity (Label="Awesome Demo App", MainLauncher=true, Icon="@drawable/myicon")]
public class MyActivity : Activity
{
}
En este ejemplo se genera el siguiente 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>
Permisos
Al agregar permisos al manifiesto de Android (como se describe en Agregar permisos al manifiesto de Android),estos permisos se registran en Propiedades/AndroidManifest.xml.
Por ejemplo, si establece el permiso, se agrega el siguiente elemento a INTERNETINTERNET:
<uses-permission android:name="android.permission.INTERNET" />
Las compilaciones de depuración establecen automáticamente algunos permisos para facilitar la depuración (como y ): esta configuración solo se establece en el INTERNETREAD_EXTERNAL_STORAGEINTERNET generado y no se muestran como habilitadas en la configuración Permisos READ_EXTERNAL_STORAGE
Por ejemplo, si examina el archivo de manifiesto generado en obj/Debug/android/AndroidManifest.xml, es posible que vea los siguientes elementos de permiso agregados:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
En la versión de compilación de versión del manifiesto (en obj/Debug/android/AndroidManifest.xml), estos permisos no se configuran automáticamente. Si ve que el cambio a una compilación de versión hace que la aplicación pierda un permiso que estaba disponible en la compilación de depuración, compruebe que ha establecido explícitamente este permiso en la configuración Permisos necesarios para la aplicación (consulte Compilar aplicación Android en Visual Studio para Mac; vea Propiedades manifiesto de Android en Visual Studio).
Características avanzadas
Acciones y características de intención
El manifiesto de Android proporciona una manera de describir las funcionalidades de la actividad. Esto se realiza a través de intenciones y el[IntentFilter] atributo personalizado. Puede especificar qué acciones son adecuadas para su actividad con elIntentFilter constructor, y qué categorías son adecuadas con elPropiedad Categories. Se debe proporcionar al menos una actividad (por lo que se proporcionan actividades en el constructor). [IntentFilter] se puede proporcionar varias veces y cada uso da como resultado un elemento <intent-filter/> independiente dentro de <activity/> . Por ejemplo:
[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
{
}
En este ejemplo se genera el siguiente 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 de la aplicación
El manifiesto de Android también proporciona una manera de declarar propiedades para toda la aplicación. Esto se realiza a través del <application> elemento y su homólogo, el atributo personalizado <application> Tenga en cuenta que se trata de una configuración de toda la aplicación (en toda la aplicación) en lugar de la configuración por actividad. Normalmente, se declaran propiedades para toda la aplicación y, a continuación, se invalida esta configuración (según sea <application> necesario) por actividad.
Por ejemplo, se agrega el atributo siguiente a ApplicationApplication para indicar que la aplicación se puede depurar, que su nombre legible por el usuario es Miaplicación y que usa el estilo como tema predeterminado para todas las actividades:
[assembly: Application (Debuggable=true,
Label="My App",
Theme="@android:style/Theme.Light")]
Esta declaración hace que se genere el siguiente fragmento XML en obj/Debug/android/AndroidManifest.xml:
<application android:label="My App"
android:debuggable="true"
android:theme="@android:style/Theme.Light"
... />
En este ejemplo, todas las actividades de la aplicación tendrán como valor predeterminado el Theme.Light estilo . Si establece el tema de una actividad en , solo esa actividad usará el estilo mientras que todas las demás actividades de la aplicación tendrán como valor predeterminado el estilo establecido Theme.DialogTheme.Dialog en el elemento Theme.Light<application> .
El Application elemento no es la única manera de configurar <application> atributos. Como alternativa, puede insertar atributos directamente en el <application> elemento de <application>. Esta configuración se combina en el elemento final <application> que reside en <application>. Tenga en cuenta que el contenido de Properties/AndroidManifest.xml siempre invalida los datos proporcionados por atributos personalizados.
Hay muchos atributos de toda la aplicación que puede configurar en el elemento ; para obtener más información sobre estos valores, vea la sección Propiedades públicas <application> de ApplicationAttribute<application> .
Lista de atributos personalizados
- Android.App.ActivityAttribute: genera un fragmento XML /manifest/application/activity
- Android.App.ApplicationAttribute: genera un fragmento XML /manifest/application
- Android.App.InstrumentationAttribute: genera un fragmento XML /manifest/instrumentation
- Android.App.IntentFilterAttribute: genera un fragmento XML //intent-filter
- Android.App.MetaDataAttribute: genera un fragmento XML //meta-data
- Android.App.PermissionAttribute: genera un fragmento XML //permission
- Android.App.PermissionGroupAttribute: genera un fragmento XML //permission-group
- Android.App.PermissionTreeAttribute: genera un fragmento XML //permission-tree
- Android.App.ServiceAttribute: genera un fragmento XML /manifest/application/service
- Android.App.UsesLibraryAttribute: genera un fragmento XML /manifest/application/uses-library
- Android.App.UsesPermissionAttribute: genera un fragmento XML /manifest/uses-permission
- Android.Content.BroadcastReceiverAttribute: genera un fragmento XML /manifest/application/receiver
- Android.Content.ContentProviderAttribute: genera un fragmento XML /manifest/application/provider
- Android.Content.GrantUriPermissionAttribute: genera un fragmento XML /manifest/application/provider/grant-uri-permission