Erstellen von Android-DienstenCreating Android Services

In diesem Handbuch werden die xamarin. Android-Dienste erläutert, bei denen es sich um Android-Komponenten handelt, die das erledigen von Aufgaben ohne eine aktive Benutzeroberfläche ermöglichen Dienste werden häufig für Aufgaben verwendet, die im Hintergrund ausgeführt werden, wie z. b. zeitaufwändige Berechnungen, Herunterladen von Dateien, Abspielen von Musik usw. Es werden die verschiedenen Szenarios erläutert, für die Dienste geeignet sind, und es wird gezeigt, wie Sie sowohl zum Ausführen von Hintergrundaufgaben mit langer Laufzeit als auch zum Bereitstellen einer Schnittstelle für Remote Prozedur Aufrufe implementiert werden.This guide discusses Xamarin.Android services, which are Android components that allow work to be done without an active user interface. Services are very commonly used for tasks that are performed in the background, such as time consuming calculations, downloading files, playing music, and so on. It explains the different scenarios that services are suited for and shows how to implement them both for performing long-running background tasks as well as for providing an interface for remote procedure calls.

Übersicht über Android-DiensteAndroid Services Overview

Mobile Apps sind nicht wie Desktop-Apps.Mobile apps are not like desktop apps. Desktops haben viele Ressourcen, z. b. Bildschirmimmobilien, Arbeitsspeicher, Speicherplatz und eine verbundene Stromversorgung, Mobile Geräte nicht.Desktops have copious amounts of resources such as screen real estate, memory, storage space, and a connected power supply, mobile devices do not. Diese Einschränkungen erzwingen, dass Mobile Apps anders Verhalten.These constraints force mobile apps to behave differently. Beispielsweise bedeutet der kleine Bildschirm auf einem mobilen Gerät in der Regel, dass jeweils nur eine APP (d. h. Aktivität) sichtbar ist.For example, the small screen on a mobile device typically means that only one app (i.e. Activity) is visible at a time. Andere Aktivitäten werden in den Hintergrund verschoben und in den Zustand "angehalten" versetzt, in dem Sie keine Arbeit ausführen können.Other Activities are moved to the background and pushed into a suspended state where they cannot perform any work. Da eine Android-Anwendung im Hintergrund ist, bedeutet dies jedoch nicht, dass es nicht möglich ist, dass die APP weiterhin funktioniert.However, just because an Android application is in the background does not mean that it is impossible for app to keep working.

Android-Anwendungen bestehen aus mindestens einer der vier folgenden primären Komponenten: Aktivitäten, Broadcast Empfänger, _Inhaltsanbieter_und Dienste.Android applications are made up of at least one of the following four primary components: Activities, Broadcast Receivers, Content Providers, and Services. Aktivitäten sind der Eckpfeiler vieler großartiger Android-Anwendungen, da Sie die Benutzeroberfläche bereitstellen, die einem Benutzer die Interaktion mit der Anwendung ermöglicht.Activities are the cornerstone of many great Android applications because they provide the UI that allows a user to interact with the application. Wenn es jedoch um gleichzeitige oder Hintergrundarbeit geht, sind Aktivitäten nicht immer die beste Wahl.However, when it comes to performing concurrent or background work, Activities are not always the best choice.

Der primäre Mechanismus für Hintergrundaufgaben in Android ist der- Dienst.The primary mechanism for background work in Android is the service. Bei einem Android-Dienst handelt es sich um eine Komponente, die für einige Aufgaben ohne Benutzeroberfläche konzipiert ist.An Android service is a component that is designed to do some work without a user interface. Ein Dienst kann eine Datei herunterladen, Musik abspielen oder einen Filter auf ein Image anwenden.A service might download a file, play music, or apply a filter to an image. Dienste können auch für die prozessübergreifende Kommunikation (prozessübergreifende Communication,IPC) zwischen Android-Anwendungen verwendet werden.Services can also be used for interprocess communication (IPC) between Android applications. Beispielsweise kann eine Android-App den Music Player-Dienst verwenden, der aus einer anderen APP besteht, oder eine APP kann Daten (z. b. Kontaktinformationen einer Person) über einen Dienst für andere apps verfügbar machen.For example one Android app might use the music player service that is from another app or an app might expose data (such as a person's contact information) to other apps via a service.

Dienste und ihre Fähigkeit zur Durchführung von Hintergrundaufgaben sind entscheidend für eine reibungslose und fließende Benutzeroberfläche.Services, and their ability to perform background work, are crucial to providing a smooth and fluid user interface. Alle Android-Anwendungen verfügen über einen Haupt Thread (auch als _Benutzeroberflächen Thread_bezeichnet), auf dem die Aktivitäten ausgeführt werden.All Android applications have a main thread (also known as a UI thread) on which the Activities are run. Damit das Gerät reaktionsfähig bleibt, muss Android die Benutzeroberfläche mit der Rate von 60 Frames pro Sekunde aktualisieren können.To keep the device responsive, Android must be able to update the user interface at the rate of 60 frames per second. Wenn eine Android-App zu viele Aufgaben im Haupt Thread durchführt, werden die Frames von Android gelöscht, was wiederum dazu führt, dass die Benutzeroberfläche ruckartig erscheint (manchmal auch als " Janky" bezeichnet).If an Android app performs too much work on the main thread, then Android will drop frames, which in turn causes the UI to appear jerky (also sometimes referred to as janky). Dies bedeutet, dass alle Vorgänge, die im UI-Thread ausgeführt werden, in der Zeitspanne zwischen zwei Frames ausgeführt werden sollten, ungefähr 16 Millisekunden (1 Sekunde alle 60 Frames).This means that any work performed on the UI thread should complete in the time span between two frames, approximately 16 milliseconds (1 second every 60 frames).

Um dieses Problem zu beheben, kann ein Entwickler Threads in einer Aktivität verwenden, um einige Aufgaben auszuführen, die die Benutzeroberfläche blockieren würden.To address this concern, a developer may use threads in an Activity to perform some work that would block the UI. Dies kann jedoch zu Problemen führen.However, this could cause problems. Es ist durchaus möglich, dass Android die mehrere Instanzen der Aktivität zerstört und neu erstellt.It is very possible that Android will destroy and recreate the multiple instances of the Activity. Allerdings werden die Threads von Android nicht automatisch zerstört, was zu Speicher Verlusten führen kann.However, Android will not automatically destroy the threads, which could result in memory leaks. Ein gutes Beispiel hierfür ist, wenn das Gerät gedreht wird – , versucht Android, die Instanz der Aktivität zu zerstören und dann eine neue zu erstellen:A prime example of this is when the device is rotated – Android will try to destroy the instance of the Activity and then recreate a new one:

Wenn das Gerät rotiert, wird Instanz 1 zerstört und Instanz 2 erstellt.

Dies ist ein potenzieller Speicherplatz – . der Thread, der von der ersten Instanz der Aktivität erstellt wurde, wird weiterhin ausgeführt.This is a potential memory leak – the thread created by the first instance of the Activity will still be running. Wenn der Thread über einen Verweis auf die erste Instanz der Aktivität verfügt, wird verhindert, dass Android das Objekt durch die Garbage Collection sammelt.If the thread has a reference to the first instance of the Activity, this will prevent Android from garbage collecting the object. Die zweite Instanz der Aktivität wird jedoch noch erstellt (was wiederum möglicherweise einen neuen Thread erstellt).However, the second instance of the Activity is still created (which in turn might create a new thread). Wenn Sie das Gerät mehrmals in der schnell Folge drehen, können Sie den gesamten RAM ausschöpfen und erzwingen, dass Android die gesamte Anwendung beendet, um Speicher freizugeben.Rotating the device several times in rapid succession may exhaust all the RAM and force Android to terminate the entire application to reclaim memory.

Als Faustregel gilt: Wenn die auszuführende Arbeit eine Aktivität übersteigen soll, sollte ein Dienst erstellt werden, um die Arbeit auszuführen.As a rule of thumb, if the work to be performed should outlive an Activity, then a service should be created to perform that work. Wenn die Arbeit jedoch nur im Kontext einer Aktivität anwendbar ist, kann das Erstellen eines Threads zum Ausführen der Arbeit besser geeignet sein.However, if the work is only applicable in the context of an Activity, then creating a thread to perform the work might be more appropriate. Beispielsweise sollte das Erstellen einer Miniaturansicht für ein Foto, das soeben zu einer Fotogalerie-app hinzugefügt wurde, wahrscheinlich in einem Dienst auftreten.For example, creating a thumbnail for a photo that was just added to a photo gallery app should probably occur in a service. Ein Thread kann jedoch besser für die Wiedergabe von Musik geeignet sein, die nur dann gehört, wenn sich eine Aktivität im Vordergrund befindet.However, a thread might be more appropriate to play some music that should only be heard while an Activity is in the foreground.

Hintergrundaufgaben können in zwei allgemeine Klassifizierungen unterteilt werden:Background work can be broken down into two broad classifications:

  1. Aufgabe mit langer Ausführungs Zeit – Diese Arbeit wird bis zum expliziten Beenden fortgeführt.Long Running Task – This is work that is ongoing until explicitly stopped. Ein Beispiel für eine Aufgabe mit langer Ausführungszeit ist eine APP, die Musik streamen oder die von einem Sensor gesammelten Daten überwachen muss.An example of a long running task is an app that streams music or that must monitor data collected from a sensor. Diese Tasks müssen ausgeführt werden, obwohl die Anwendung über keine sichtbare Benutzeroberfläche verfügt.These tasks must run even though the application has no visible user interface.
  2. Periodische Aufgaben – (manchmal auch als _Auftrag_bezeichnet) Bei einer regelmäßigen Aufgabe handelt es sich um einen relativ kurzen Zeitraum (mehrere Sekunden), der nach einem Zeitplan ausgeführt wird (d. h. einmal pro Tag oder in den nächsten 60 Sekunden).Periodic Tasks – (sometimes referred to as a job) A periodic task is one that is of relatively short in duration (several seconds) and is run on a schedule (i.e. once a day for a week or perhaps just once in the next 60 seconds). Ein Beispiel hierfür ist das Herunterladen einer Datei aus dem Internet oder das Erstellen einer Miniaturansicht für ein Bild.An example of this is downloading a file from the internet or generating a thumbnail for an image.

Es gibt vier verschiedene Arten von Android-Diensten:There are four different types of Android services:

  • Gebundener Dienst – Ein gebundener Dienst ist ein Dienst, dem eine andere Komponente (in der Regel eine Aktivität) gebunden ist.Bound Service – A bound service is a service that has some other component (typically an Activity) bound to it. Ein gebundener Dienst stellt eine Schnittstelle bereit, mit der die gebundene Komponente und der Dienst miteinander interagieren können.A bound service provides an interface that allows the bound component and the service to interact with each other. Wenn keine weiteren Clients an den Dienst gebunden sind, wird der Dienst von Android heruntergefahren.Once there are no more clients bound to the service, Android will shut the service down.

  • IntentService–Eine IntentService ist eine spezialisierte Unterklasse der Service -Klasse, die die Erstellung und Verwendung von Diensten vereinfacht.IntentService – An IntentService is a specialized subclass of the Service class that simplifies service creation and usage. Ein IntentService ist für die Behandlung einzelner autonomer Aufrufe vorgesehen.An IntentService is meant to handle individual autonomous calls. Anders als bei einem-Dienst, der gleichzeitig mehrere-Aufrufe verarbeiten kann, IntentService ähnelt ein Arbeits warte Schlangen – -Prozessor arbeiten in der Warteschlange, und ein IntentService verarbeitet jeden Auftrag einzeln in einem einzelnen Arbeits Thread.Unlike a service, which can concurrently handle multiple calls, an IntentService is more like a work queue processor – work is queued up and an IntentService processes each job one at a time on a single worker thread. In der Regel IntentService ist eine nicht an eine Aktivität oder ein Fragment gebunden.Typically, anIntentService is not bound to an Activity or a Fragment.

  • Dienst wurde gestartet. Started Service – Ein gestarteter Dienst ist ein Dienst, der von einer anderen Android-Komponente (z. b. einer Aktivität) gestartet wurde und fortlaufend im Hintergrund ausgeführt wird, bis der Dienst explizit angehalten wird.Started Service – A started service is a service that has been started by some other Android component (such as an Activity) and is run continuously in the background until something explicitly tells the service to stop. Anders als bei einem gebundenen Dienst weist ein gestarteter Dienst keine Clients direkt an ihn an.Unlike a bound service, a started service does not have any clients directly bound to it. Aus diesem Grund ist es wichtig, begonnene Dienste so zu entwerfen, dass Sie bei Bedarf ordnungsgemäß neu gestartet werden können.For this reason, it is important to design started services so that they may be gracefully restarted as necessary.

  • Hybrid Dienst – Bei einem Hybrid Dienst handelt es sich um einen Dienst, der die Merkmale eines gestarteten Dienstanbieter und eines _gebundenen Dienstanbieter_aufweist.Hybrid Service – A hybrid service is a service that has the characteristics of a started service and a bound service. Ein Hybrid Dienst kann von gestartet werden, wenn eine Komponente an ihn gebunden wird, oder er kann von einem Ereignis gestartet werden.A hybrid service can be started by when a component binds to it or it may be started by some event. Eine Client Komponente kann oder nicht an den Hybrid Dienst gebunden werden.A client component may or may not be bound to the hybrid service. Ein Hybrid Dienst wird weiterhin ausgeführt, bis er explizit beendet wird, oder bis keine Clients mehr an ihn gebunden sind.A hybrid service will keep running until it is explicitly told to stop, or until there are no more clients bound to it.

Welcher Diensttyp verwendet werden muss, hängt von den Anwendungsanforderungen ab.Which type of service to use is very dependent on application requirements. Als Faustregel gilt: ein IntentService oder ein gebundener Dienst reicht für die meisten Aufgaben aus, die eine Android-Anwendung ausführen muss. Daher sollte eine der beiden Dienst Typen bevorzugt werden.As a rule of thumb, an IntentService or a bound service are sufficient for most tasks that an Android application must perform, so preference should be given to one of those two types of services. Ein IntentService ist eine gute Wahl für "One-Shot"-Aufgaben, z. b. das Herunterladen einer Datei, während ein gebundener Dienst geeignet wäre, wenn häufig Interaktionen mit einer Aktivität/einem Fragment erforderlich sind.An IntentService is a good choice for "one-shot" tasks, such as downloading a file, while a bound service would be suitable when frequent interactions with an Activity/Fragment is required.

Während die meisten Dienste im Hintergrund ausgeführt werden, gibt es eine spezielle Unterkategorie, die als _Vordergrund Dienst_bezeichnet wird.While most services run in the background, there is a special sub-category known as a foreground service. Dabei handelt es sich um einen Dienst, der eine höhere Priorität erhält (im Vergleich zu einem normalen Dienst), um die Arbeit für den Benutzer auszuführen (z. b. das Abspielen von Musik).This is a service that is given a higher priority (compared to a normal service) to perform some work for the user (such as playing music).

Es ist auch möglich, einen Dienst in einem eigenen Prozess auf demselben Gerät auszuführen. Dies wird manchmal auch als Remote Dienst oder als _Prozess interner Dienst_bezeichnet.It is also possible to run a service in its own process on the same device, this is sometimes referred to as a remote service or as an out-of-process service. Dies erfordert mehr Aufwand für die Erstellung, kann jedoch nützlich sein, wenn eine Anwendung Funktionen für andere Anwendungen freigeben muss und in manchen Fällen die Benutzer Funktionalität einer Anwendung verbessert werden kann.This does require more effort to create, but can be useful for when an application needs to share functionality with other applications, and can, in some cases, improve the user experience of an application.

Grenzwerte für die Hintergrund Ausführung in Android 8,0Background Execution Limits in Android 8.0

Ab Android 8,0 (API-Ebene 26) ist eine Android-Anwendung nicht mehr in der Lage, frei im Hintergrund auszuführen.Starting in Android 8.0 (API level 26), an Android application no longer have the ability to run freely in the background. Im Vordergrund kann eine APP Dienste ohne Einschränkung starten und ausführen.When in the foreground, an app can start and run services without restriction. Wenn sich eine Anwendung im Hintergrund bewegt, erteilt Android der APP einen gewissen Zeitraum, um Dienste zu starten und zu verwenden.When an application moves into the background, Android will grant the app a certain amount of time to start and use services. Wenn diese Zeit abgelaufen ist, kann die APP keine Dienste mehr starten, und alle gestarteten Dienste werden beendet.Once that time has elapsed, the app can no longer start any services and any services that were started will be terminated. An diesem Punkt ist es nicht möglich, dass die APP irgendeine Arbeit ausführt.At this point it is not possible for the app to perform any work. Android betrachtet eine Anwendung als Vordergrund, wenn eine der folgenden Bedingungen erfüllt ist:Android considers an application to be in the foreground if one of the following conditions are met:

  • Es ist eine sichtbare Aktivität (entweder gestartet oder angehalten) vorhanden.There is a visible activity (either started or paused).
  • Die APP hat einen Vordergrund Dienst gestartet.The app has started a foreground service.
  • Eine andere APP befindet sich im Vordergrund und verwendet Komponenten aus einer APP, die sich andernfalls im Hintergrund befinden würden.Another app is in the foreground and is using components from an app that would be otherwise in the background. Dies ist beispielsweise der Fall, wenn die Anwendung a, die sich im Vordergrund befindet, an einen von Anwendung b bereitgestellten Dienst gebunden ist. Anwendung b würde dann auch im Vordergrund berücksichtigt werden und nicht von Android für die Verwendung im Hintergrund beendet werden.An example of this is if Application A, which is in the foreground, is bound to a service provided by Application B. Application B would then also be considered in the foreground, and not terminated by Android for being in the background.

Es gibt einige Situationen, in denen Android, auch wenn eine APP im Hintergrund ist, die APP reaktivieren und diese Einschränkungen für einige Minuten lockern können, sodass die APP einige Arbeit erledigen kann:There are some situations where, even though an app is in the background, Android will wake up the app and relax these restrictions for a few minutes, allowing the app to perform some work:

  • Von der APP wird eine Firebase-Cloud-Nachricht mit hoher Priorität empfangen.A high priority Firebase Cloud Message is received by the app.
  • Die App empfängt eine Broadcast-app.The app receives a broadcast.
  • Die Anwendung empfängt und führt als PendingIntent Antwort auf eine Benachrichtigung aus.The application receives and executes a PendingIntent in response to a Notification.

Vorhandene xamarin. Android-Anwendungen müssen möglicherweise ändern, wie Sie Hintergrundaufgaben durchführen, um Probleme zu vermeiden, die möglicherweise auf Android 8,0 auftreten.Existing Xamarin.Android applications may have to change how they perform background work to avoid any issues that might arise on Android 8.0. Im folgenden finden Sie einige praktische Alternativen zu einem Android-Dienst:Here are some practical alternatives to an Android service:

  • **Planen der Ausführung von Arbeitsaufgaben im Hintergrund mithilfe des Android-Auftrags Planers oder des Firebase-Auftrags ** – Verteilers Diese beiden Bibliotheken bieten ein Framework für Anwendungen, mit denen Sie Hintergrundaufgaben in _Aufträge_aufteilen können. Dies ist eine diskrete Arbeitseinheit.Schedule work to run in the background using the Android Job Scheduler or the Firebase Job Dispatcher – These two libraries provide a framework for applications to segregate background work in to jobs, a discrete unit of work. Apps können dann den Auftrag mit dem Betriebssystem zusammen mit einigen Kriterien planen, wann der Auftrag ausgeführt werden kann.Apps can then schedule the job with the operating system along with some criteria about when the job can run.
  • Starten Sie den Dienst im Vordergrund – . ein Vordergrund Dienst ist nützlich, wenn die APP eine Aufgabe im Hintergrund ausführen muss und der Benutzer möglicherweise regelmäßig mit dieser Aufgabe interagieren muss.Start the service in the foreground – a foreground service is useful for when the app must perform some task in the background and the user may need to periodically interact with that task. Der Vordergrund Dienst zeigt eine permanente Benachrichtigung an, sodass der Benutzer weiß, dass die APP eine Hintergrundaufgabe ausführen und eine Möglichkeit bietet, die Aufgabe zu überwachen oder mit Ihnen zu interagieren.The foreground service will display a persistent notification so that the user is aware that the app is running a background task and also provides a way to monitor or interact with the task. Ein Beispiel hierfür wäre eine Podcasting-APP, die einen Podcast für den Benutzer wieder gibt oder vielleicht eine Podcasts-Episode herunterlädt, damit Sie später wiedergegeben werden kann.An example of this would be a podcasting app that is playing back a podcast to the user or perhaps downloading a podcast episode so that it can be enjoyed later.
  • Verwenden einer Firebase-Cloud-Nachricht mit hoher Priorität (SCM) – Wenn Android einen FCM mit hoher Priorität für eine App empfängt, kann diese APP Dienste für kurze Zeit im Hintergrund ausführen.Use a high priority Firebase Cloud Message (FCM) – When Android receives a high priority FCM for an app, it will allow that app to run services in the background for a short period of time. Dies wäre eine gute Alternative zur Verwendung eines Hintergrund Dienstanbieter, der eine APP im Hintergrund abruft.This would be a good alternative to having a background service that polls an app in the background.
  • Aufgaben für den Fall, dass die app in den Vordergrund – rückt, verzögern Wenn keine der vorherigen Lösungen geeignet ist, müssen apps eine eigene Methode zum Anhalten und Fortsetzen der Arbeit entwickeln, wenn die APP im Vordergrund steht.Defer work for when the app comes into the foreground – If none of the previous solutions are viable, then apps must develop their own way to pause and resume work when the app comes to the foreground.