Arbeiten mit dem Android-Manifest
AndroidManifest.xml ist eine leistungsstarke Datei auf der Android-Plattform, mit der Sie die Funktionen und Anforderungen Ihrer Anwendung für Android beschreiben können. Es ist jedoch nicht einfach, damit zu arbeiten. Xamarin.Android trägt dazu bei, diese Schwierigkeit zu minimieren, indem Sie Ihren Klassen benutzerdefinierte Attribute hinzufügen können, die dann verwendet werden, um das Manifest automatisch für Sie zu generieren. Unser Ziel ist es, dass 99 % unserer Benutzer nie manuell AndroidManifest.xmländern müssen.
AndroidManifest.xml wird im Rahmen des Buildprozesses generiert, und der xml-Code in Eigenschaften/AndroidManifest.xml wird mit XML zusammengeführt, das aus benutzerdefinierten Attributen generiert wird. Die resultierende zusammengeführte AndroidManifest.xml befindet sich im Unterverzeichnis obj ; Sie befindet sich beispielsweise unter obj/Debug/android/AndroidManifest.xml für Debugbuilds. Der Zusammenführungsprozess ist trivial: Es verwendet benutzerdefinierte Attribute innerhalb des Codes, um XML-Elemente zu generieren, und fügt diese Elemente in AndroidManifest.xmlein.
Die Grundlagen
Zur Kompilierzeit werden Assemblys auf Nicht-Klassenabstract
überprüft, die von Activity abgeleitet sind und für die das [Activity]
Attribut deklariert ist. Anschließend werden diese Klassen und Attribute verwendet, um das Manifest zu erstellen. Beachten Sie z. B. folgenden Code:
namespace Demo
{
public class MyActivity : Activity
{
}
}
Dies führt dazu, dass in AndroidManifest.xmlnichts generiert wird. Wenn Sie möchten, dass ein <activity/>
Element generiert wird, müssen Sie die[Activity]
benutzerdefiniertes Attribut:
namespace Demo
{
[Activity]
public class MyActivity : Activity
{
}
}
In diesem Beispiel wird das folgende XML-Fragment zuAndroidManifest.xmlhinzugefügt:
<activity android:name="md5a7a3c803e481ad8926683588c7e9031b.MainActivity" />
Das [Activity]
Attribut hat keine Auswirkung auf abstract
Typen. abstract
Typen werden ignoriert.
Activity Name
Ab Xamarin.Android 5.1 basiert der Typname einer Aktivität auf dem MD5SUM des assemblyqualifizierten Namens des exportierten Typs. Dadurch kann derselbe voll qualifizierte Name von zwei verschiedenen Assemblys bereitgestellt werden, ohne dass ein Paketfehler auftritt. (Vor Xamarin.Android 5.1 wurde der Standardtypname der Aktivität aus dem kleingeschriebenen Namespace und dem Klassennamen erstellt.)
Wenn Sie diese Standardeinstellung außer Kraft setzen und explizit den Namen Ihrer Aktivität angeben möchten, verwenden Sie die Name
-Eigenschaft:
[Activity (Name="awesome.demo.activity")]
public class MyActivity : Activity
{
}
In diesem Beispiel wird das folgende XML-Fragment erzeugt:
<activity android:name="awesome.demo.activity" />
Hinweis
Sie sollten die Eigenschaft nur aus Gründen der Name
Abwärtskompatibilität verwenden, da eine solche Umbenennung die Typsuche zur Laufzeit verlangsamen kann. Wenn Sie über Legacycode verfügen, der erwartet, dass der Standardtypname der Aktivität auf dem Kleinbuchstabennamespace und dem Klassennamen basiert, finden Sie unter Android Callable Wrapper Naming Tipps zur Aufrechterhaltung der Kompatibilität.
Aktivitätstitelleiste
Android gibt Ihrer Anwendung standardmäßig eine Titelleiste, wenn sie ausgeführt wird.
Der dafür verwendete Wert ist /manifest/application/activity/@android:label
.
In den meisten Fällen unterscheidet sich dieser Wert vom Klassennamen. Verwenden Sie die -Eigenschaft, um die Label
Bezeichnung Ihrer App auf der Titelleiste anzugeben.
Beispiel:
[Activity (Label="Awesome Demo App")]
public class MyActivity : Activity
{
}
In diesem Beispiel wird das folgende XML-Fragment erzeugt:
<activity android:label="Awesome Demo App"
android:name="md5a7a3c803e481ad8926683588c7e9031b.MainActivity" />
Startbar über Application Chooser
Standardmäßig wird Ihre Aktivität nicht im Anwendungsstartbildschirm von Android angezeigt. Dies liegt daran, dass es wahrscheinlich viele Aktivitäten in Ihrer Anwendung gibt und Sie nicht für jede ein Symbol verwenden möchten. Verwenden Sie MainLauncher
die -Eigenschaft, um anzugeben, welche vom Anwendungsstartprogramm aus gestartet werden kann. Beispiel:
[Activity (Label="Awesome Demo App", MainLauncher=true)]
public class MyActivity : Activity
{
}
In diesem Beispiel wird das folgende XML-Fragment erzeugt:
<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>
Aktivitätssymbol
Standardmäßig erhält Ihre Aktivität das vom System bereitgestellte Standardstartprogrammsymbol. Um ein benutzerdefiniertes Symbol zu verwenden, fügen Sie zuerst Ihre .png zu Ressourcen/drawable hinzu, legen Sie die Buildaktion auf AndroidResource fest, und verwenden Sie dann die Icon
-Eigenschaft, um das zu verwendende Symbol anzugeben. Beispiel:
[Activity (Label="Awesome Demo App", MainLauncher=true, Icon="@drawable/myicon")]
public class MyActivity : Activity
{
}
In diesem Beispiel wird das folgende XML-Fragment erzeugt:
<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>
Berechtigungen
Wenn Sie dem Android-Manifest Berechtigungen hinzufügen (wie unter Hinzufügen von Berechtigungen zu Android-Manifest beschrieben), werden diese Berechtigungen unter Eigenschaften/AndroidManifest.xmlaufgezeichnet.
Wenn Sie z. B. die INTERNET
Berechtigung festlegen, wird das folgende Element zu Eigenschaften/AndroidManifest.xmlhinzugefügt:
<uses-permission android:name="android.permission.INTERNET" />
Debugbuilds legen einige Berechtigungen automatisch fest, um das Debuggen zu vereinfachen (z INTERNET
. B. und READ_EXTERNAL_STORAGE
). Diese Einstellungen werden nur im generierten obj/Debug/android/AndroidManifest.xml festgelegt und in den Einstellungen für erforderliche Berechtigungen nicht als aktiviert angezeigt.
Wenn Sie beispielsweise die generierte Manifestdatei unter obj/Debug/android/AndroidManifest.xmluntersuchen, sehen Sie möglicherweise die folgenden hinzugefügten Berechtigungselemente:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
In der Releasebuildversion des Manifests ( unter obj/Debug/android/AndroidManifest.xml) werden diese Berechtigungen nicht automatisch konfiguriert. Wenn Sie feststellen, dass der Wechsel zu einem Releasebuild dazu führt, dass Ihre App eine Berechtigung verliert, die im Debugbuild verfügbar war, überprüfen Sie, ob Sie diese Berechtigung explizit in den Einstellungen für erforderliche Berechtigungen für Ihre App festgelegt haben (siehe Erstellen > einer Android-Anwendung in Visual Studio für Mac; siehe Eigenschaften > Android-Manifest in Visual Studio).
Erweiterte Funktionen
Absichtsaktionen und -features
Das Android-Manifest bietet Ihnen eine Möglichkeit, die Funktionen Ihrer Aktivität zu beschreiben. Dies erfolgt über Absichten und die[IntentFilter]
benutzerdefiniertes Attribut. Sie können angeben, welche Aktionen für Ihre Aktivität geeignet sind, mit derIntentFilter
-Konstruktor und welche Kategorien für die geeignet sindCategories
-Eigenschaft. Es muss mindestens eine Aktivität bereitgestellt werden (weshalb Aktivitäten im -Konstruktor bereitgestellt werden). [IntentFilter]
kann mehrmals bereitgestellt werden, und jede Verwendung führt zu einem separaten <intent-filter/>
Element innerhalb des <activity/>
. Beispiel:
[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 diesem Beispiel wird das folgende XML-Fragment erzeugt:
<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>
Application-Element
Das Android-Manifest bietet ihnen auch eine Möglichkeit, Eigenschaften für Ihre gesamte Anwendung zu deklarieren. Dies erfolgt über das <application>
-Element und sein Pendant, das benutzerdefinierte Application-Attribut . Beachten Sie, dass es sich dabei um anwendungsweite (assemblyweite) Einstellungen und nicht um Aktivitätseinstellungen handelt. In der Regel deklarieren <application>
Sie Eigenschaften für Ihre gesamte Anwendung und überschreiben diese Einstellungen dann (bei Bedarf) pro Aktivität.
Beispielsweise wird das folgende Application
Attribut zu AssemblyInfo.cs hinzugefügt, um anzugeben, dass die Anwendung debuggt werden kann, dass ihr benutzerlesbarer Name Meine App ist und dass sie den Theme.Light
Stil als Standarddesign für alle Aktivitäten verwendet:
[assembly: Application (Debuggable=true,
Label="My App",
Theme="@android:style/Theme.Light")]
Diese Deklaration bewirkt, dass das folgende XML-Fragment in obj/Debug/android/AndroidManifest.xmlgeneriert wird:
<application android:label="My App"
android:debuggable="true"
android:theme="@android:style/Theme.Light"
... />
In diesem Beispiel wird für alle Aktivitäten in der App standardmäßig der Theme.Light
Stil verwendet. Wenn Sie das Design einer Aktivität auf Theme.Dialog
festlegen, verwendet nur diese Aktivität den Theme.Dialog
Stil, während für alle anderen Aktivitäten in Ihrer App standardmäßig die Theme.Light
im <application>
-Element festgelegte Formatvorlage verwendet wird.
Das Application
-Element ist nicht die einzige Möglichkeit, Attribute zu konfigurieren <application>
. Alternativ können Sie Attribute direkt in das <application>
Element von Properties/AndroidManifest.xmleinfügen. Diese Einstellungen werden in das letzte <application>
Element zusammengeführt, das sich in obj/Debug/android/AndroidManifest.xmlbefindet. Beachten Sie, dass der Inhalt von Eigenschaften/AndroidManifest.xml daten, die von benutzerdefinierten Attributen bereitgestellt werden, immer überschreiben.
Es gibt viele anwendungsweite Attribute, die Sie im <application>
-Element konfigurieren können. Weitere Informationen zu diesen Einstellungen finden Sie im Abschnitt Öffentliche Eigenschaften von ApplicationAttribute.
Liste der benutzerdefinierten Attribute
- Android.App.ActivityAttribute : Generiert ein /manifest/application/activity-XML-Fragment .
- Android.App.ApplicationAttribute: Generiert ein /manifest/application-XML-Fragment
- Android.App.InstrumentationAttribute : Generiert ein /manifest/instrumentation-XML-Fragment
- Android.App.IntentFilterAttribute : Generiert ein //intent-filter-XML-Fragment
- Android.App.MetaDataAttribute : Generiert ein //meta-data-XML-Fragment
- Android.App.PermissionAttribute: Generiert ein //permission-XML-Fragment
- Android.App.PermissionGroupAttribute : Generiert ein //permission-group-XML-Fragment
- Android.App.PermissionTreeAttribute : Generiert ein //permission-tree-XML-Fragment
- Android.App.ServiceAttribute: Generiert ein /manifest/application/service-XML-Fragment
- Android.App.UsesLibraryAttribute : Generiert ein /manifest/application/uses-library-XML-Fragment
- Android.App.UsesPermissionAttribute : Generiert ein /manifest/uses-permission-XML-Fragment .
- Android.Content.BroadcastReceiverAttribute: Generiert ein /manifest/application/receiver-XML-Fragment
- Android.Content.ContentProviderAttribute: Generiert ein /manifest/application/provider-XML-Fragment
- Android.Content.GrantUriPermissionAttribute : Generiert ein XML-Fragment "/manifest/application/provider/grant-uri-permission "