Condividi tramite


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_STORAGEnecessarie.

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