Udostępnij za pośrednictwem


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 niekonfigurowane 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.Dialogwartość , 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