Praca z manifestem systemu Android
AndroidManifest.xml to zaawansowany plik na platformie Android, który umożliwia opisanie funkcjonalności i wymagań aplikacji w systemie Android. Jednak praca z nim nie jest łatwa. Platforma Xamarin.Android pomaga zminimalizować tę trudność, umożliwiając dodawanie atrybutów niestandardowych do klas, które następnie będą używane do automatycznego generowania manifestu. Naszym celem jest to, że 99% naszych użytkowników nigdy nie powinno wymagać ręcznego modyfikowania AndroidManifest.xml.
AndroidManifest.xml jest generowany w ramach procesu kompilacji, a kod XML znaleziony w obszarze Właściwości/AndroidManifest.xml jest scalony z kodem XML generowanym na podstawie atrybutów niestandardowych. Wynikowy scalony AndroidManifest.xml znajduje się w podkatalogu obj , na przykład znajduje się w folderze obj/Debug/android/AndroidManifest.xml dla kompilacji debugowania. Proces scalania jest banalny: używa atrybutów niestandardowych w kodzie do generowania elementów XML i wstawia te elementy do AndroidManifest.xml.
Podstawy
W czasie kompilacji zestawy są skanowane pod kątem klas innych niżabstract
klasy pochodzące z klasy Activity i mają [Activity]
atrybut zadeklarowany na nich. Następnie użyje tych klas i atrybutów do skompilowania manifestu. Rozważmy na przykład następujący kod:
namespace Demo
{
public class MyActivity : Activity
{
}
}
Spowoduje to wygenerowanie niczego w AndroidManifest.xml. Jeśli chcesz <activity/>
wygenerować element, musisz użyć polecenia [Activity]
atrybut niestandardowy:
namespace Demo
{
[Activity]
public class MyActivity : Activity
{
}
}
Ten przykład powoduje dodanie następującego fragmentu xml do AndroidManifest.xml:
<activity android:name="md5a7a3c803e481ad8926683588c7e9031b.MainActivity" />
Atrybut [Activity]
nie ma wpływu na abstract
typy; abstract
typy są ignorowane.
Nazwa działania
Począwszy od platformy Xamarin.Android 5.1, nazwa typu działania jest oparta na MD5SUM nazwy kwalifikowanej przez zestaw typu eksportowanego. Dzięki temu ta sama w pełni kwalifikowana nazwa może być dostarczana z dwóch różnych zestawów i nie występuje błąd pakowania. (Przed wersją Xamarin.Android 5.1 domyślna nazwa typu działania została utworzona z małej przestrzeni nazw i nazwy klasy).
Jeśli chcesz zastąpić tę wartość domyślną i jawnie określić nazwę działania, użyj Name
właściwości :
[Activity (Name="awesome.demo.activity")]
public class MyActivity : Activity
{
}
W tym przykładzie jest generowany następujący fragment xml:
<activity android:name="awesome.demo.activity" />
Uwaga
Właściwość powinna być używana Name
tylko ze względów zgodności z poprzednimi wersjami, ponieważ taka zmiana nazwy może spowolnić wyszukiwanie typów w czasie wykonywania. Jeśli masz starszy kod, który oczekuje domyślnej nazwy typu działania na podstawie małej przestrzeni nazw i nazwy klasy, zobacz Android Callable Wrapper Naming , aby uzyskać wskazówki dotyczące zachowania zgodności.
Pasek tytułu działania
Domyślnie system Android udostępnia aplikacji pasek tytułu po uruchomieniu.
Wartość używana dla tego elementu to /manifest/application/activity/@android:label
.
W większości przypadków ta wartość różni się od nazwy klasy. Aby określić etykietę aplikacji na pasku tytułu, użyj Label
właściwości .
Na przykład:
[Activity (Label="Awesome Demo App")]
public class MyActivity : Activity
{
}
W tym przykładzie jest generowany następujący fragment xml:
<activity android:label="Awesome Demo App"
android:name="md5a7a3c803e481ad8926683588c7e9031b.MainActivity" />
Uruchamianie z poziomu programu Application Selectr
Domyślnie działanie nie będzie wyświetlane na ekranie uruchamiania aplikacji systemu Android. Jest to spowodowane tym, że w aplikacji prawdopodobnie będzie wiele działań i nie potrzebujesz ikony dla każdego z nich. Aby określić, który z nich powinien być uruchamiany z poziomu uruchamiania MainLauncher
aplikacji, użyj właściwości . Na przykład:
[Activity (Label="Awesome Demo App", MainLauncher=true)]
public class MyActivity : Activity
{
}
W tym przykładzie jest generowany następujący fragment 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>
Ikona działania
Domyślnie działanie będzie mieć domyślną ikonę uruchamiania udostępnioną przez system. Aby użyć ikony niestandardowej, najpierw dodaj .png do opcji Resources/drawable, ustaw jej akcję kompilacji na Wartość AndroidResource, a następnie użyj Icon
właściwości , aby określić ikonę do użycia. Na przykład:
[Activity (Label="Awesome Demo App", MainLauncher=true, Icon="@drawable/myicon")]
public class MyActivity : Activity
{
}
W tym przykładzie jest generowany następujący fragment 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>
Uprawnienia
Po dodaniu uprawnień do manifestu systemu Android (zgodnie z opisem w artykule Dodawanie uprawnień do manifestu systemu Android) te uprawnienia są rejestrowane w obszarze Właściwości/AndroidManifest.xml.
Jeśli na przykład ustawisz INTERNET
uprawnienie, do właściwości/AndroidManifest.xml zostanie dodany następujący element:
<uses-permission android:name="android.permission.INTERNET" />
Kompilacje debugowania automatycznie ustawiają pewne uprawnienia, aby ułatwić debugowanie (takie jak INTERNET
i READ_EXTERNAL_STORAGE
) — te ustawienia są ustawiane tylko w wygenerowanym obj/Debug/android/AndroidManifest.xml i nie są wyświetlane jako włączone w ustawieniach Wymaganych uprawnień .
Jeśli na przykład zbadasz wygenerowany plik manifestu w folderze obj/Debug/android/AndroidManifest.xml, mogą zostać wyświetlone następujące dodane elementy uprawnień:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
W wersji kompilacji wydania manifestu (w obj/Debug/android/AndroidManifest.xml) te uprawnienia nie są konfigurowane automatycznie. Jeśli okaże się, że przełączenie do kompilacji wydania powoduje utratę uprawnień, które było dostępne w kompilacji debugowania, sprawdź, czy jawnie ustawiono to uprawnienie w ustawieniach Wymaganych uprawnień dla aplikacji (zobacz Kompilowanie > aplikacji systemu Android w Visual Studio dla komputerów Mac; zobacz Właściwości > Manifest systemu Android w programie Visual Studio).
funkcje zaawansowane
Akcje i funkcje intencji
Manifest systemu Android umożliwia opisanie możliwości działania. Odbywa się to za pośrednictwem intencji i [IntentFilter]
atrybut niestandardowy. Możesz określić, które akcje są odpowiednie dla działania za pomocą polecenia IntentFilter
konstruktor i które kategorie są odpowiednie dla Categories
Właściwość. Należy podać co najmniej jedno działanie (dlatego działania są udostępniane w konstruktorze). [IntentFilter]
można podać wiele razy, a każdy z nich używa wyników w osobnym <intent-filter/>
elemecie w obiekcie <activity/>
. Na przykład:
[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
{
}
W tym przykładzie jest generowany następujący fragment 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>
Application, element
Manifest systemu Android umożliwia również deklarowanie właściwości dla całej aplikacji. Odbywa się to za pośrednictwem <application>
elementu i jego odpowiednika, atrybutu niestandardowego Aplikacja . Należy pamiętać, że są to ustawienia obejmujące całą aplikację (w całym zestawie), a nie ustawienia dla poszczególnych działań. Zazwyczaj należy zadeklarować <application>
właściwości dla całej aplikacji, a następnie zastąpić te ustawienia (zgodnie z potrzebami) dla poszczególnych działań.
Na przykład następujący Application
atrybut jest dodawany do AssemblyInfo.cs , aby wskazać, że można debugować aplikację, że jej nazwa czytelna dla użytkownika to Moja aplikacja i że używa Theme.Light
stylu jako motywu domyślnego dla wszystkich działań:
[assembly: Application (Debuggable=true,
Label="My App",
Theme="@android:style/Theme.Light")]
Ta deklaracja powoduje wygenerowanie następującego fragmentu XML w pliku obj/Debug/android/AndroidManifest.xml:
<application android:label="My App"
android:debuggable="true"
android:theme="@android:style/Theme.Light"
... />
W tym przykładzie wszystkie działania w aplikacji będą domyślnie oznaczać Theme.Light
styl. Jeśli ustawisz motyw działania na Theme.Dialog
wartość , tylko to działanie będzie używać Theme.Dialog
stylu, podczas gdy wszystkie inne działania w aplikacji będą domyślnie ustawiane Theme.Light
jako styl ustawiony w elemecie <application>
.
Element Application
nie jest jedynym sposobem konfigurowania <application>
atrybutów. Alternatywnie można wstawić atrybuty bezpośrednio do <application>
elementu Właściwości/AndroidManifest.xml. Te ustawienia są scalane z ostatnim <application>
elementem, który znajduje się w pliku obj/Debug/android/AndroidManifest.xml. Należy pamiętać, że zawartość właściwości/AndroidManifest.xml zawsze przesłania dane dostarczane przez atrybuty niestandardowe.
Istnieje wiele atrybutów dla całej aplikacji, które można skonfigurować w elemecie <application>
. Aby uzyskać więcej informacji na temat tych ustawień, zobacz sekcję Właściwości publiczne applicationAttribute.
Lista atrybutów niestandardowych
- Android.App.ActivityAttribute: generuje fragment XML /manifest/application/activity
- Android.App.ApplicationAttribute : generuje fragment /manifest/application XML
- Android.App.InstrumentationAttribute: generuje fragment XML /manifest/instrumentation
- Android.App.IntentFilterAttribute: generuje fragment XML //intent-filter
- Android.App.MetaDataAttribute: generuje fragment XML //meta-data
- Android.App.PermissionAttribute: generuje fragment XML //permission
- Android.App.PermissionGroupAttribute: generuje fragment XML //permission-group
- Android.App.PermissionTreeAttribute: generuje fragment XML //permission-tree
- Android.App.ServiceAttribute: generuje fragment XML /manifest/application/service
- Android.App.UsesLibraryAttribute: generuje fragment XML /manifest/application/uses-library
- Android.App.UsesPermissionAttribute: generuje fragment XML /manifest/uses-permission
- Android.Content.BroadcastReceiverAttribute: generuje fragment XML /manifest/application/receiver
- Android.Content.ContentProviderAttribute: generuje fragment XML /manifest/application/provider
- Android.Content.GrantUriPermissionAttribute : Generuje fragment XML /manifest/application/provider/grant-uri-permission XML