Uso del manifesto Android
AndroidManifest.xml è un file potente nella piattaforma Android che consente di descrivere le funzionalità e i requisiti dell'applicazione in Android. Tuttavia, lavorare con esso non è facile. Xamarin.Android consente di ridurre al minimo questa difficoltà consentendo di aggiungere attributi personalizzati alle classi, che verranno quindi usati per generare automaticamente il manifesto. L'obiettivo è che il 99% degli utenti non deve mai modificare manualmente AndroidManifest.xml.
AndroidManifest.xml viene generato come parte del processo di compilazione e il codice XML trovato in Proprietà/AndroidManifest.xml viene unito con XML generato da attributi personalizzati. Il AndroidManifest.xml unito risultante risiede nella sottodirectory obj, ad esempio risiede in obj/Debug/android/AndroidManifest.xml per le compilazioni di debug. Il processo di unione è semplice: usa attributi personalizzati all'interno del codice per generare elementi XML e inserisce tali elementi in AndroidManifest.xml.
Nozioni di base
In fase di compilazione, gli assembly vengono analizzati perabstract
individuare classi non che derivano da Activity e che hanno l'attributo [Activity]
dichiarato su di essi. Usa quindi queste classi e attributi per compilare il manifesto. Si consideri il codice di esempio seguente:
namespace Demo
{
public class MyActivity : Activity
{
}
}
Ciò comporta la generazione di alcun elemento in AndroidManifest.xml. Se si desidera generare un <activity/>
elemento, è necessario usare [Activity]
attributo personalizzato:
namespace Demo
{
[Activity]
public class MyActivity : Activity
{
}
}
In questo esempio viene aggiunto il frammento xml seguente a AndroidManifest.xml:
<activity android:name="md5a7a3c803e481ad8926683588c7e9031b.MainActivity" />
L'attributo non ha alcun effetto sui abstract
tipi. abstract
I [Activity]
tipi vengono ignorati.
Nome attività
A partire da Xamarin.Android 5.1, il nome del tipo di un'attività è basato su MD5SUM del nome completo dell'assembly del tipo esportato. In questo modo è possibile specificare lo stesso nome completo da due assembly diversi e non ottenere un errore di creazione del pacchetto. (Prima di Xamarin.Android 5.1, il nome del tipo predefinito dell'attività è stato creato dallo spazio dei nomi in minuscolo e dal nome della classe).
Se si desidera eseguire l'override di questo valore predefinito e specificare in modo esplicito il nome dell'attività, usare la Name
proprietà :
[Activity (Name="awesome.demo.activity")]
public class MyActivity : Activity
{
}
In questo esempio viene generato il frammento xml seguente:
<activity android:name="awesome.demo.activity" />
Nota
È consigliabile usare la proprietà solo per motivi di compatibilità con le versioni precedenti, in quanto tale ridenominazione può rallentare la Name
ricerca dei tipi in fase di esecuzione. Se si dispone di codice legacy che prevede che il nome di tipo predefinito dell'attività sia basato sullo spazio dei nomi in minuscolo e sul nome della classe, vedere Denominazione del wrapper chiamabile Android per suggerimenti sulla gestione della compatibilità.
Barra del titolo attività
Per impostazione predefinita, Android assegna all'applicazione una barra del titolo quando viene eseguita.
Il valore usato per questo è /manifest/application/activity/@android:label
.
Nella maggior parte dei casi, questo valore sarà diverso dal nome della classe. Per specificare l'etichetta dell'app sulla barra del titolo, usa la Label
proprietà .
Ad esempio:
[Activity (Label="Awesome Demo App")]
public class MyActivity : Activity
{
}
In questo esempio viene generato il frammento xml seguente:
<activity android:label="Awesome Demo App"
android:name="md5a7a3c803e481ad8926683588c7e9031b.MainActivity" />
Avviabile da Selezione applicazione
Per impostazione predefinita, l'attività non verrà visualizzata nella schermata di avvio delle applicazioni android. Ciò è dovuto al fatto che nell'applicazione saranno probabilmente presenti molte attività e non si vuole un'icona per ogni attività. Per specificare quale deve essere avviato dall'utilità di avvio dell'applicazione, usare la MainLauncher
proprietà . Ad esempio:
[Activity (Label="Awesome Demo App", MainLauncher=true)]
public class MyActivity : Activity
{
}
In questo esempio viene generato il frammento xml seguente:
<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>
Icona attività
Per impostazione predefinita, all'attività verrà assegnata l'icona di avvio predefinita fornita dal sistema. Per usare un'icona personalizzata, aggiungere prima di tutto il .png a Resources/drawable, impostarne l'azione di compilazione su AndroidResource, quindi usare la Icon
proprietà per specificare l'icona da usare. Ad esempio:
[Activity (Label="Awesome Demo App", MainLauncher=true, Icon="@drawable/myicon")]
public class MyActivity : Activity
{
}
In questo esempio viene generato il frammento xml seguente:
<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>
Autorizzazioni
Quando si aggiungono autorizzazioni al manifesto Android (come descritto in Aggiungere autorizzazioni al manifesto Android), queste autorizzazioni vengono registrate in Proprietà/AndroidManifest.xml.
Ad esempio, se si imposta l'autorizzazione, l'elemento INTERNET
seguente viene aggiunto a Proprietà/AndroidManifest.xml:
<uses-permission android:name="android.permission.INTERNET" />
Le compilazioni di debug impostano automaticamente alcune autorizzazioni per semplificare il debug ,ad esempio INTERNET
e . Queste impostazioni vengono impostate solo nell'obj/Debug/android/AndroidManifest.xml generato e non vengono visualizzate come abilitate nelle impostazioni AutorizzazioniREAD_EXTERNAL_STORAGE
necessarie.
Ad esempio, se si esamina il file manifesto generato in obj/Debug/android/AndroidManifest.xml, è possibile che vengano visualizzati gli elementi di autorizzazione aggiunti seguenti:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Nella versione release build del manifesto (in obj/Debug/android/AndroidManifest.xml), queste autorizzazioni non vengono configurate automaticamente. Se si scopre che il passaggio a una build di rilascio causa la perdita di un'autorizzazione disponibile nella build di debug, verificare di aver impostato in modo esplicito questa autorizzazione nelle impostazioni autorizzazioni necessarie per l'app (vedere Compilare > un'applicazione Android in Visual Studio per Mac; vedere Proprietà > Manifesto Android in Visual Studio).
funzionalità avanzate
Azioni e funzionalità delle finalità
Il manifesto Android consente di descrivere le funzionalità dell'attività. Questa operazione viene eseguita tramite finalità e [IntentFilter]
attributo personalizzato. È possibile specificare le azioni appropriate per l'attività con IntentFilter
costruttore e quali categorie sono appropriate con il Proprietà Categories
. È necessario specificare almeno un'attività ,motivo per cui le attività vengono fornite nel costruttore. [IntentFilter]
può essere fornito più volte e ogni utilizzo restituisce un elemento separato <intent-filter/>
all'interno di <activity/>
. Ad esempio:
[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
{
}
In questo esempio viene generato il frammento xml seguente:
<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
Il manifesto Android offre anche un modo per dichiarare le proprietà per l'intera applicazione. Questa operazione viene eseguita tramite l'elemento <application>
e la relativa controparte, l'attributo personalizzato Application . Si noti che si tratta di impostazioni a livello di applicazione (a livello di assembly) anziché di impostazioni per attività. In genere, si dichiarano <application>
le proprietà per l'intera applicazione e quindi si eseguono l'override di queste impostazioni (in base alle esigenze) in base all'attività.
Ad esempio, l'attributo seguente Application
viene aggiunto a AssemblyInfo.cs per indicare che è possibile eseguire il debug dell'applicazione, che il nome leggibile dell'utente è App personale e che usa lo Theme.Light
stile come tema predefinito per tutte le attività:
[assembly: Application (Debuggable=true,
Label="My App",
Theme="@android:style/Theme.Light")]
Questa dichiarazione fa sì che il frammento XML seguente venga generato in obj/Debug/android/AndroidManifest.xml:
<application android:label="My App"
android:debuggable="true"
android:theme="@android:style/Theme.Light"
... />
In questo esempio, per impostazione predefinita tutte le attività nell'app saranno lo Theme.Light
stile. Se imposti il tema di un'attività su Theme.Dialog
, solo l'attività userà lo Theme.Dialog
stile mentre tutte le altre attività nell'app verranno impostate Theme.Light
come impostate nell'elemento <application>
.
L'elemento Application
non è l'unico modo per configurare <application>
gli attributi. In alternativa, è possibile inserire gli attributi direttamente nell'elemento <application>
di Proprietà/AndroidManifest.xml. Queste impostazioni vengono unite nell'elemento finale <application>
che risiede in obj/Debug/android/AndroidManifest.xml. Si noti che il contenuto di Proprietà/AndroidManifest.xml eseguire sempre l'override dei dati forniti dagli attributi personalizzati.
Esistono molti attributi a livello di applicazione che è possibile configurare nell'elemento <application>
. Per altre informazioni su queste impostazioni, vedere la sezione Proprietà pubbliche di ApplicationAttribute.
Elenco di attributi personalizzati
- Android.App.ActivityAttribute: genera un frammento XML /manifest/application/activity
- Android.App.ApplicationAttribute: genera un frammento XML /manifest/application
- Android.App.InstrumentationAttribute: genera un frammento XML /manifest/instrumentation
- Android.App.IntentFilterAttribute: genera un frammento XML //intent-filter
- Android.App.MetaDataAttribute: genera un frammento XML //meta-data
- Android.App.PermissionAttribute: genera un frammento XML //permission
- Android.App.PermissionGroupAttribute: genera un frammento XML //permission-group
- Android.App.PermissionTreeAttribute: genera un frammento XML //permission-tree
- Android.App.ServiceAttribute: genera un frammento XML /manifest/application/service
- Android.App.UsesLibraryAttribute: genera un frammento XML /manifest/application/uses-library
- Android.App.UsesPermissionAttribute : genera un frammento XML /manifest/uses-permission XML
- Android.Content.BroadcastReceiverAttribute: genera un frammento XML /manifest/application/receiver
- Android.Content.ContentProviderAttribute: genera un frammento XML /manifest/application/provider
- Android.Content.GrantUriPermissionAttribute : genera un frammento XML /manifest/application/provider/grant-uri-permission XML