Es ist für mich.
Schauen Sie sich das Folgende direkt an, da es möglicherweise falsch ist.
Es scheint, dass einige Seiteninhalte in Englisch und Japanisch unterschiedlich sind.
Sie können andere Anwendungskomponenten starten, und selbst wenn der Benutzer zu einer anderen Anwendung wechselt, wird diese weiterhin im Hintergrund verarbeitet.
Darüber hinaus können Komponenten und Dienste gebunden und kommuniziert werden, und eine Kommunikation zwischen Prozessen ist möglich. Beispielsweise können Netzwerkverarbeitung, Musikwiedergabe, Datei-E / A, Kommunikation mit Inhaltsanbietern usw. im Hintergrund verarbeitet werden.
■Foreground
foregroundService führt den dem Benutzer mitgeteilten Prozess aus. Beispielsweise verwendet eine Audio-App ForegroundService, um auf einer Audiospur abzuspielen. Der Vordergrunddienst zeigt Benachrichtigungen an. Wenn der Benutzer nicht mit der App interagiert, wird der Vordergrunddienst diese weiterhin verarbeiten.
■Background
Der Hintergrunddienst führt eine Verarbeitung durch, die vom Benutzer nicht direkt bemerkt wird. Bei einem Dienst, der den App-Speicher komprimiert, handelt es sich beispielsweise um einen Hintergrundprozess.
Hinweis: Wenn die App API 26 oder höher ist und die App nicht auf Vordergrund eingestellt ist, legt das System Einschränkungen für die Ausführung von Hintergrunddiensten fest. Führen Sie in solchen Fällen stattdessen die geplante Arbeit aus. font> td> table>
■Bound
Binden Sie den Dienst mit bindService () </ font> an die Anwendungskomponente. Der gebundene Dienst bietet eine Client-Server-Schnittstelle für die Kommunikation mit der Komponente. Zum Beispiel Anforderungsübertragung, Ergebnisempfang, Prozesskommunikation usw.
Der gebundene Dienst wird niemals beendet, solange andere Anwendungskomponenten an den Dienst gebunden sind.
Services können sowohl explizites Starten als auch Binden sein. In der Dokumentation wird jedoch das Starten und Binden separat beschrieben.
Die Implementierung fordert entweder den Dienststart mit onStartCommand () </ font> an oder ermöglicht die Bindung mit onBind () </ font>. Mach es auch nicht.
Jede Anwendungskomponente kann Intent verwenden, um denselben Dienst auf dieselbe Weise zu starten, wie jede Aktivität verwendet wird. Es ist auch möglich, ein Verbot für andere Apps im Manifest zu definieren. Weitere Informationen> https://developer.android.com/guide/components/services#Declaring
COUTION:
Sofern Sie keine Methode angeben, erstellt der Dienst keinen eigenen Thread und wird nicht in einem anderen Thread ausgeführt.
Daher ist es für eine umfangreiche Verarbeitung wie MP3-Wiedergabe und Netzwerkverarbeitung erforderlich, einen neuen Thread im Dienst zu erstellen und in einem anderen Thread zu verarbeiten, um ein Einfrieren der Benutzeroberfläche zu verhindern. font> td> table>
Welchen verwenden Sie, Service oder Thread?
・ Wenn der Dienst im Hintergrund verarbeitet wird
・ Wenn der Thread von einem anderen als dem Haupt-Thread verarbeitet werden muss
Wenn Sie beispielsweise nur Musik abspielen möchten, während die Aktivität ausgeführt wird, erstellen Sie einen Thread in onCreate (), starten Sie die Ausführung mit onStart () und beenden Sie die Ausführung mit onStop ().
Sie können auch AsyncTasc oder HandlerThread anstelle von Thread verwenden.
|
Überschreiben Sie die für die Erstellung des Dienstes wichtige Methode
onStartCommand() / onBind() / onCreate() / onDestroy()
■onStartCommand()
Das System ruft ** onStartCommand () ** auf, wenn andere Komponenten, z. B. Aktivitäten, ** startService () ** aufrufen, um den Start des Dienstes anzufordern. Der Dienst wird gestartet, wenn onStartCommand () ausgeführt wird.
Verwenden Sie bei der Implementierung von onStartCommand () ** stopSelf () ** oder ** stopServece () **, wenn der Dienst abgeschlossen ist, um den Dienst selbst zu stoppen (wenn Sie nur eine Bindung bereitstellen, ist onStartCommand () Sie müssen es nicht implementieren).
■onBind()
Das System ruft ** onBind () ** auf, wenn es ** bindService () ** aufruft, um andere Komponenten an den Service zu binden.
Bei der Implementierung von onBind () muss IBinder </ font> zurückgegeben werden, um die Schnittstelle bereitzustellen, über die Klein mit Service kommuniziert.
Sie müssen immer onBind () implementieren, aber wenn Sie keine Bindung zulassen, sollten Sie ** null ** zurückgeben.
■onCreate()
Eine Methode, die beim erstmaligen Erstellen des Dienstes für einen einmaligen Einrichtungsprozess aufgerufen wird, bevor onStartCommand () oder onBind () aufgerufen werden.
■onDestroy()
Eine Methode, die aufgerufen wird, wenn der Dienst längere Zeit nicht verwendet oder zerstört wurde. Der Dienst implementiert diese Methode, um Ressourcen für Threads, registrierte Listener und Empfänger zu bereinigen. Diese Methode ist der letzte Anruf, den der Dienst erhält.
Serviceende
■stopSelf() stopService()
Sobald eine Komponente einen Dienst mit startService () in onStartCommand () gestartet hat, wird der Dienst so lange ausgeführt, bis der Dienst sich mit stopSelf () beendet oder eine andere Komponente stopService () ausführt.
■unbind
Wenn die Komponente einen Dienst mit bindService () </ font> erstellt, ohne onStartCommand () aufzurufen, wird der Dienst so lange ausgeführt, wie die Komponente an den Dienst gebunden ist. Wenn alle Dienste vom Client getrennt wurden, zerstört das System den Dienst.
■ Zerstörung des Dienstes durch das Android-System
Das Android-System beendet den Dienst nur, wenn der Arbeitsspeicher niedrig ist und die Systemressourcen für die Aktivität, mit der Sie interagieren, wiederhergestellt werden müssen. Dienste, die an die vom Benutzer verwendete Aktivität gebunden sind, werden mit geringerer Wahrscheinlichkeit zerstört. Dienste, die für die Ausführung im Vordergrund definiert sind, werden selten zerstört.
Mit der Zeit wird das System seine Position in der Hintergrundaufgabenliste des Dienstes verringern. Der Entwickler sollte den Service-Return-Prozess vom System entwerfen. Abhängig vom Rückgabewert von onStartCommand () </ font> stellt das System die Ressourcen wieder her und bringt den Dienst zurück, wenn das System den Dienst zerstört. Weitere Informationen finden Sie unter https://developer.android.com/guide/components/processes-and-threads.html
Manifest Erklärung
<manifest ... >
...
<application ... >
<service android:name=".ExampleService" />
...
</application>
</manifest>
~ </ Service> definiert die Eigenschaften, die zum Starten des Service oder des Prozesses, der den Service ausführt, erforderlich sind.
■android:name
Geben Sie den Klassennamen des Dienstes an. Nur erforderliches Attribut, unveränderlich
** Um Ihre App zu schützen, verwenden Sie beim Starten oder Binden eines Dienstes immer eine explizite Absicht. ** ** **
COUTION:
Verwenden Sie zum Starten eines Dienstes immer eine explizite Absicht, um die Sicherheit Ihrer App zu gewährleisten, und deklarieren Sie keinen Filter für Dienstabsichten.
Implizite Absichten sind gefährlich. Der Entwickler kann den von der Absicht zurückgegebenen Service möglicherweise nicht sehen, oder der Benutzer ist sich des Starts des Service möglicherweise nicht bewusst.
In Android5.0 (API21) und höher löst das System beim Aufrufen von bindService () eine Ausnahme aus.
|
■android:exported
Indem Sie false im Attribut android: exported </ font> definieren und hinzufügen, können Sie den Dienst nur für diese App verfügbar machen. Auf diese Weise rufen andere Apps den Dienst nicht auf, selbst wenn Sie explizite Absichten verwenden.
■android:description
Note:
Benutzer können sehen, welche Dienste auf dem Gerät ausgeführt werden. Wenn ein Dienst gefunden wird, den der Benutzer nicht zulässt oder dem er nicht vertraut, kann er den Dienst beenden.
Um zu verhindern, dass Benutzer versehentlich einen Dienst stoppen, fügen Sie dem -Element im Manifest Ihrer App ein android: description strong> -Attribut hinzu, um sicherzustellen, dass der Dienst benötigt / nützlich ist. Bitte erklären Sie in einem kurzen Satz. font> td> table>
Wenn Sie den Lebenszyklus detaillierter verwalten möchten> https://developer.android.com/guide/components/services#Lifecycle
~~ Wenn Sie Unklarheiten darüber hinterlassen möchten, welcher Dienst gestartet werden soll, definieren Sie einen Intent-Filter für Service, schließen Sie den Komponentennamen von Intent aus und setzen Sie dann setPackage (um die Mehrdeutigkeit des Zieldienstes zu beseitigen). Sie müssen das Intent-Paket mit) festlegen. ~~
Generieren Sie den angeforderten Service
** Was ist der angeforderte Service: **
Der Dienst muss von einer anderen Komponente generiert werden, die startService () aufruft und die Methode onStartCommand () verwendet.
Wenn ein Dienst gestartet wird, hat er unabhängig von der aufrufenden Komponente einen eigenen Lebenszyklus.
Der Dienst wird unbegrenzt im Hintergrund ausgeführt, auch wenn die aufrufende Komponente zerstört wird. Wenn der Vorgang abgeschlossen ist, führt entweder stopSelf () </ font> dazu, dass sich der Dienst selbst beendet, oder stopService () </ font> wird verwendet. Beenden Sie den Dienst von der Komponente von.
Anwendungskomponenten wie Aktivitäten können einen Dienst starten, indem sie startService () </ font> aufrufen und Intent </ font> übergeben. Absicht gibt den Dienst an, der gestartet werden soll </ font> und übergibt die von diesem Dienst verwendeten Daten. Der Dienst erhält diese Absicht mit der Methode onStartCommand () </ font>.
Angenommen, eine Aktivität speichert Daten in einer Online-Datenbank. Die Aktivität startet einen Begleitdienst und übergibt eine Absicht an startService (), damit die gespeicherten Daten bereitgestellt werden können.
Der Dienst empfängt die Absicht von onStartCommand () </ font> und führt die Datenbankverarbeitung über das Internet aus. Wenn der Vorgang abgeschlossen ist, beendet sich der Dienst von selbst und der Dienst wird zerstört.
COUTION:
Der Dienst wird im selben Prozess wie die deklarierte Anwendung ausgeführt und standardmäßig im Hauptthread dieser Anwendung.
Wenn der Dienst intensiv ausgeführt wird oder eine Blockierungsoperation ausführt, während der Benutzer an der Aktivität derselben Anwendung arbeitet, wird die Leistung der Aktivität beeinträchtigt.
Erstellen Sie einen neuen Thread im Service und lassen Sie ihn den Thread verarbeiten, um Leistungseinbußen zu vermeiden.
|
Eine erweiterbare Klasse zum Generieren des angeforderten Dienstes
Service
Basisklasse für alle Dienste.
Der Dienst verwendet standardmäßig den Hauptthread der App, sodass die Verarbeitung des Dienstes die Aktivitätsleistung verlangsamen kann.
Daher ist es beim Erweitern dieser Klasse wichtig, einen neuen Thread zu erstellen, der den Serviceprozess abschließt.
IntentService
Eine Unterklasse von Diensten, die einen Arbeitsthread verwendet, der alle Dienstgenerierungsanforderungen einzeln verarbeitet. Ideal, wenn der Service nicht mehrere Generierungsanforderungen gleichzeitig verarbeiten muss.
Durch einfaches Implementieren von onHandleIntent () </ font> können Sie die Absicht jeder Generierungsanforderung empfangen und die Hintergrundverarbeitung durchführen.
Erweiterung der IntentService-Klasse
Der angeforderte Service kann einfacher durch Erweitern der IntentService-Klasse als durch Erweitern der Service-Klasse implementiert werden. </ font> Ein guter Fall für die Erweiterung der Service-Klasse zur Behandlung von Absichten ist, wenn der Service mehrere Threads ausführen muss (anstatt Startanforderungen über die Arbeitswarteschlange zu verarbeiten). ist.
Die meisten zum Starten angeforderten Dienste müssen nicht mehrere Anforderungen gleichzeitig verarbeiten. Das Entwerfen mit Multithreading ist gefährlich. Es ist am besten, den Service mit der IntentService-Klasse </ font> zu implementieren.
Funktionsweise der Klasse IntentService </ font>.
--Erstellen Sie einen Thread, um alle an onStartCommand () </ font> gelieferten Absichten auszuführen. Dieser Thread trennt sich vom Haupt-Thread der Anwendung.
--Erstellen Sie eine Arbeitswarteschlange, die die Absichten einzeln an onHandleIntent () </ font> übergibt, damit Sie nicht mehrere Threads erstellen müssen.
- Sie müssen nicht stopSelf () << / font> verwenden, da der Dienst nach der Verarbeitung aller Startanforderungen gestoppt wird.
- onBind () </ font> ist standardmäßig implementiert. Das implementierte onBind () gibt null zurück.
- onStartCommand () </ font> ist standardmäßig implementiert. Der implementierte onStartCommand () sendet eine Absicht und einen implementierten onHandleIntent () </ font> an die Arbeitswarteschlange.
Implementieren Sie onHandleIntent () </ font>, um die vom Client angeforderte Arbeit abzuschließen. Für den Service ist jedoch ein Konstruktor erforderlich.
IntenService-Implementierungsbeispiel </ font>
public class HelloIntentService extends IntentService {
/**
* the super <code><a href="/reference/android/app/IntentService.html#IntentService(java.lang.String)">IntentService(String)</a></code>
*Super im Konstruktor aufrufen (erforderlich)
*/
public HelloIntentService() {
super("HelloIntentService");
}
/**
*IntentService ist die Absicht, mit der der Dienst gestartet wurde.
*Rufen Sie diese Methode über den Standard-Worker-Thread auf.
*Wenn diese Methode zurückgegeben wird, stoppt IntentService den Dienst bei Bedarf.
*/
@Override
protected void onHandleIntent(Intent intent) {
//Normalerweise funktioniert diese Methode wie das Herunterladen einer Datei.
//Im Beispiel codiere ich den Prozess so, dass er 5 Sekunden lang in den Ruhezustand wechselt
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
Dies ist die gesamte von IntentService () erforderliche Verarbeitung, z. B. die Implementierung und der Konstruktor von onHandleIntent () </ font>.
Wenn Sie andere Rückrufmethoden wie onCreate (), onStartCommend (), onDestory () </ font> überschreiben möchten, rufen Sie Super Implementation (übergeordnete Implementierung) auf. Verwalten Sie den IntentService-Lebenszyklus ordnungsgemäß.
onStartCommand () </ font> gibt die Standardimplementierung auf eine Weise zurück, die onHandleIntent () </ font> beabsichtigt.
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();
return super.onStartCommand(intent,flags,startId);
}
Neben onHandleIntent () </ font> ist onBind () </ font> die einzige Methode, die die Oberklasse nicht aufrufen muss. Diese Implementierungen sind erforderlich, wenn der Dienst gebunden werden darf.
Serviceklassenerweiterung
Wenn Sie Multithreading ausführen müssen, erweitern Sie den Service und verwenden Sie jede Absicht, um die Startanforderung zu verarbeiten, anstatt sie über die Arbeitswarteschlange zu verarbeiten.
Die gleiche Verarbeitung wie der obige Code von IntentService wird implementiert, indem die unten stehende Serviceklasse erweitert wird. Für jede Startanforderung führt der Worker-Thread Jobs und Prozesse aus und verarbeitet jeweils nur eine Anforderung.
public class HelloService extends Service {
private Looper serviceLooper;
private ServiceHandler serviceHandler;
//Der Handler empfängt eine Nachricht vom Thread
private final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
//Normalerweise tun Sie dies hier, genau wie beim Herunterladen einer Datei
//Unten finden Sie einen Beispielcode, der 5 Sekunden lang schläft
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
//Wenn mehrere Verarbeitungsanforderungen vorliegen
//Beenden Sie den Dienst mit der Start-ID
//Sie können nicht aufhören, ohne die Start-ID zu verwenden
stopSelf(msg.arg1);
}
}
@Override
public void onCreate() {
//Starten Sie den Thread, der den Dienst ausführt
//Service-Verarbeitung in einem separaten Thread, um die Leistung des Haupt-Threads sicherzustellen
HandlerThread thread = new HandlerThread("ServiceStartArguments",
Process.THREAD_PRIORITY_BACKGROUND);
thread.start();
//Ruft den Fadenschleifer für den Griff ab und gibt ihn an den Griff weiter.
serviceLooper = thread.getLooper();
serviceHandler = new ServiceHandler(serviceLooper);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();
//Wenn Sie die Anforderung starten, senden Sie eine Nachricht an den von Ihnen gestarteten Prozess und senden Sie auch die Start-ID.
//Wenn der Vorgang abgeschlossen ist, kann die zu stoppende Arbeit durch eine ID bestätigt werden.
Message msg = serviceHandler.obtainMessage();
msg.arg1 = startId;
serviceHandler.sendMessage(msg);
//Wenn der Dienst beendet wird, kehren Sie hierher zurück und starten Sie ihn neu
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
// We don't provide binding, so return null
return null;
}
@Override
public void onDestroy() {
Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show();
}
}
Da jeder Aufruf von onStartCommand () </ font> vom Dienst selbst ausgeführt wird, können mehrere Anforderungen gleichzeitig ausgeführt werden. Wenn es Ihrer Situation entspricht, können Sie für jede Anforderung einen neuen Thread erstellen und sofort ausführen (Sie müssen nicht warten, bis die vorherige Anforderung abgeschlossen ist).
Die Methode onStartCommand () muss eine Ganzzahl </ font> zurückgeben. Diese Ganzzahl ist ein Wert, der angibt, wie der Dienst fortgesetzt werden soll, wenn das System den Dienst beendet (siehe unten).
-
START_NOT_STICKY
-
Wenn das System den Dienst nach der Rückkehr von onStartCommand () </ font> beendet, startet das System den Dienst nur neu, wenn die Zustellung beabsichtigt ist. .. Dies ist die sicherste Option, um das Ausführen unerwünschter Dienste zu vermeiden, wenn Sie diese nicht benötigen und Ihre Anwendung unvollständige Jobs wieder aufnehmen kann.
-
START_STICKY
-
Wenn das System den Dienst nach der Rückkehr von onStartComand () </ font> beendet, erstellen Sie den Dienst neu und onStartCommand () Ruft </ font> auf, verteilt aber nicht die letzte Absicht. Das System ruft stattdessen onStartCommand () </ font> mit einer Null-Absicht auf, es sei denn, die Absicht, den Dienst bereitzustellen, steht noch aus. Wenn eine Absicht aussteht, wird diese Absicht geliefert. Dies ist für Media Player (und ähnliche Dienste) geeignet, die keine Befehle ausführen, sondern unbegrenzt ausgeführt werden und auf Jobs warten.
-
START_REDELIVER_INTENT
-
Wenn das System den Dienst beendet, nachdem es von onStartCommand () </ font> zurückgekehrt ist, erstellen Sie den Dienst und onStartComannd () </ font> auf. Alle anstehenden Absichten werden nacheinander geliefert. Dies ist für Dienste geeignet, die Prozesse wie das Herunterladen von Dateien ausführen und sofort nach Abschluss neu gestartet werden müssen.
Servicestart
Absicht </ font> (Startdienst angeben) von der Aktivität oder einer anderen Anwendungskomponente, startService () </ font> oder <font color Übergeben Sie es an = "# 099"> startForegroundService () </ font>, um den Dienst zu starten.
Das Android-System ruft die onStartCommand () -Methode des Dienstes auf und übergibt die Absicht. Absicht gibt den zu startenden Dienst an.
Note:
Wenn die App API 26 oder höher ist und sich die App nicht im Vordergrund befindet, legt das System Einschränkungen für die Verwendung und Generierung von Hintergrunddiensten fest. Wenn Sie Ihre App mit ForegroundService generieren möchten, verwenden Sie startForegroundService () strong> font>. Sobald ein Dienst erstellt wurde, muss er innerhalb von 5 Sekunden die startForegroun () -Methode font> aufrufen.
|
Verwenden der expliziten Absicht in startService ()
Beispielcode zum Starten des Dienstes
Intent intent = new Intent(this,HelloService.class);
startService(intent);
Die startService () </ font> -Methode bewirkt, dass das Android-System die onStartCommand () </ font> -Methode des Dienstes ausführt. Wenn der Dienst noch nicht ausgeführt wird, führt das System zuerst onCreate () </ font> und dann onStartCommand () </ font> aus. > Wird ausgeführt.
Wenn der Dienst keine Bindung bereitstellt, ist die von startService () </ font> bereitgestellte Absicht das einzige Kommunikationsmittel zwischen der Anwendungskomponente und dem Dienst.
Wenn der Dienst jedoch ein Ergebnis zurückgibt, kann der Client, der den Dienst anfordert, einen PendingIntent </ font> für die Übertragung erstellen ( getBroadcast () < (Verwenden Sie / font>), kann es an die Absicht </ font> des angeforderten Dienstes gesendet werden. Der Dienst kann dann Broadcast verwenden, um die Ergebnisse zu liefern.
Wenn mehrere Serviceanfragen vorliegen, werden onStartCommand () </ font> mehrfach aufgerufen, um sie zu verarbeiten, aber um zu stoppen Es ist nur ein # 099 "> stopSelf () </ font> oder stopService () </ font> erforderlich.
Dienst anhalten
Verwalten Sie nach dem Starten des Dienstes den Lebenszyklus des Dienstes. Nach dem Ausführen von onStartCommand () </ font> wird der Dienst auf unbestimmte Zeit ausgeführt und das System stoppt oder zerstört den Dienst nur, wenn der Systemspeicher wiederhergestellt wird. Um den Dienst zu beenden, führt entweder der Dienst selbst stopSelf () </ font> oder stopService () </ font> von einer anderen Komponente aus. Lauf und mach es.
Sobald stopSelf () </ font> oder stopService </ font> ausgeführt wird, zerstört das System den Dienst sofort.
Wenn der Dienst mehrere Anforderungen an onStartCommand () </ font> verarbeitet, wird eine Anforderung gestoppt, da alle anderen Anforderungen durch eine Stoppverarbeitung gestoppt werden. Beenden Sie den Dienst nicht, wenn er abgeschlossen ist.
Verwenden Sie stopSelf (int), um den Dienst zu stoppen, der mehrere Anforderungen verarbeitet. Diese Methode stellt sicher, dass Servicestoppanforderungen immer auf der neuesten Startanforderung basieren.
Insbesondere übergibt stopSelf (int) </ font> die ID der Startanforderung entsprechend der Anforderung, die Sie stoppen möchten (startId wird an onStartCommand () gesendet). Wenn der Dienst eine neue Startanforderung erhält, bevor stopSelf (int) </ font> ausgeführt werden kann, stimmen die ID der Startanforderung und die ID der Stoppversorgung nicht überein Der Service hört nicht auf.
COUTION:
Um Systemressourcen zu verschwenden und Batterien zu entladen, beenden Sie den Service immer, wenn die Anwendung abgeschlossen ist.
Beenden Sie den Dienst bei Bedarf, indem Sie stopService () strong> von anderen Komponenten aus ausführen.
Wenn Sie die Dienstbindung aktiviert haben und der Dienst mit onStartCommand () strong> ausgeführt wird, stoppen Sie den Dienst selbst mit stopSelf (). font> td> table>
Erstellen Sie einen gebundenen Service
Durch die Bindung an einen Dienst mit bindService () kann die Anwendungskomponente eine lange Verbindung herstellen (normalerweise kann der Dienst nicht von der Komponente gestartet werden, die starService () aufruft).
Generiert einen gebundenen Service, wenn er auf Aktivitäten innerhalb einer Anwendung, anderer Komponenten und Services reagiert oder anderen Anwendungen über prozessübergreifende Kommunikation Anwendungsfunktionen bietet.
Erstellen Sie einen gebundenen Service
--Implemented onBind () Gibt IBinder zurück, der die Schnittstelle für die Kommunikation mit dem Dienst definiert
--Anwendungskomponentenaufrufe bindService () Rufen Sie die Schnittstelle IBinder ab und rufen Sie die Dienstmethode auf
Wenn keine gebundenen Komponenten mehr vorhanden sind, zerstört das System den Dienst (der gebundene Dienst muss nicht auf die gleiche Weise gestoppt werden, wie er mit onStartCommand () gestartet wurde).
Um einen gebundenen Service zu generieren, müssen Sie eine Schnittstelle definieren. Diese Schnittstelle gibt an, wie mit dem Client und dem Service kommuniziert werden soll. Die für die Kommunikation zwischen Client und Service verantwortliche Schnittstelle muss IBinder </ font> implementieren, und Servise ruft onBind () </ font> auf. Muss ein IBinder sein, der von der back-Methode zurückgegeben wird. Sobald der Client den IBilder erhalten hat, kann er den Service über die Schnittstelle bedienen.
Es können mehrere Clients gleichzeitig an den Dienst gebunden werden. Wenn ein Client eine Serviceoperation beendet, führt er unbindService () </ font> aus, um die Bindung aufzuheben. Wenn keine Clients mehr an den Service gebunden werden müssen, zerstört das System den Service.
Es gibt verschiedene Möglichkeiten, einen gebundenen Dienst zu implementieren. Diese Implementierung ist komplizierter als das Starten eines Dienstes. Weitere Informationen finden Sie in diesem Dokument.> Https://developer.android.com/guide/components/bound- services.html
Senden Sie Benachrichtigungen an Benutzer
Sobald der Dienst betriebsbereit ist, können Sie den Benutzer mit einer Toastbenachrichtigung oder einer Statusleistenbenachrichtigung benachrichtigen. Eine Toastbenachrichtigung ist eine Meldung, die für einen Moment auf dem Bildschirm angezeigt wird. Benachrichtigungen in der Statusleiste zeigen ein Symbol zusammen mit einer Meldung in der Statusleiste an. Der Benutzer kann die auszuführende Aktion aus der Benachrichtigung auswählen (z. B. Starten des Dienstes).
Benachrichtigungen in der Statusleiste sind normalerweise die beste Methode, um im Hintergrund Dinge zu tun, die einen Dateidownload abschließen würden. Wenn der Benutzer eine Benachrichtigung aus der erweiterten Ansicht auswählt, kann die Aktivität über die Benachrichtigung gestartet werden (um die heruntergeladene Datei anzuzeigen).
Weitere Informationen zu Toastbenachrichtigungen und Statusleistenbenachrichtigungen>
Weitere Informationen zu Toastbenachrichtigungen> https://developer.android.com/guide/topics/ui/notifiers/toasts.html
Weitere Informationen zu Statusleistenbenachrichtigungen finden Sie unter https://developer.android.com/guide/topics/ui/notifiers/notifications.html
Führen Sie den Dienst im Vordergrund aus
ForegroundService befindet sich in einem Zustand, in dem der Benutzer den Dienst erkennen kann. Selbst wenn ihm der Speicher ausgeht, ist er kein Kandidat für eine erzwungene Beendigung durch das System. ForegroundService sollte Sie in der Statusleiste benachrichtigen und wird unter der Überschrift "In Bearbeitung" angezeigt. Die Benachrichtigung verschwindet erst, wenn der Dienst gestoppt oder aus dem Vordergrund entfernt wird.
VORSICHT: Nutzungsbeschränkungen für Vordergrunddienste
ForegroundService ist nur verfügbar, wenn Sie wissen, dass die App auf dem richtigen Weg ist und Sie sie ausführen müssen, ohne dass der Benutzer direkt mit der App interagieren muss.
ForegroundService legt die Wichtigkeit von Benachrichtigungen fest und zeigt sie in der Statusleiste an, um sicherzustellen, dass Benutzer wissen, was die App tut.
Sie sollten die Verwendung der geplanten Verarbeitung anstelle des Dienstes für Aktionen in Betracht ziehen, die die geringste Bedeutung haben.
Apps, die Service verwenden, belasten das System und verbrauchen Systemressourcen. Das Festlegen einer geringen Wichtigkeit und das Ausblenden von Benachrichtigungen kann die Leistung der vom Benutzer verwendeten App beeinträchtigen. Wenn Sie also den Dienst mit der niedrigsten Wichtigkeit ausführen möchten, finden Sie den unteren Rand der Benachrichtigungsleiste Rufen Sie die App mit auf. font> (Ist es wahrscheinlich, dass der untere Teil der Benachrichtigungsleiste aus Systemgründen gewaltsam beendet wird?) Font> font>
|
Musikplayer, die Musik auf dem Dienst abspielen, sollten so konfiguriert sein, dass sie im Vordergrund ausgeführt werden, damit der Benutzer die Ausführung der App explizit erkennt. Benachrichtigungen in der Statusleiste zeigen die abgespielte Musik an oder bedienen den Musik-Player, um Aktivitäten zu aktivieren. In ähnlicher Weise benötigen Apps, die die Reise eines Benutzers verfolgen, einen Vordergrunddienst, der den Standort des Benutzers verfolgt.
Note:
Apps, die den Vordergrunddienst unter Android 9 (API 28) oder höher verwenden, fordern die Berechtigung FOREGROUND_SERVICE strong> an. Dies ist eine normale Berechtigung, sodass das System die anfordernde App automatisch zulässt.
Wenn Sie einen ForegroundService mit API 28 oder niedriger erstellen, ohne FOREGROUND_SERVICE anzufordern, löst das System eine Sicherheitsausnahme aus.
|
Foreground Sercice
Der Vordergrunddienst muss die Benachrichtigung anzeigen und kann nicht geschlossen werden, es sei denn, der Dienst wird gestoppt oder der Dienst aus dem Vordergrund entfernt.
Erstellen Sie einen Vordergrunddienst
Führen Sie startForeground (ID, Benachrichtigung) aus
· Benachrichtigung
・ Absicht
・ PendingIntent
・ Notification.setLatestEventInfo (dies, Titel, Text, PendingIntent)
・ StartForeground (ID, Benachrichtigung) </ font>
Neue Benachrichtigung ist derzeit veraltet. Verwenden Sie notificationCompat
setLatestEventInfo ist derzeit veraltet. Verwenden wir den Builder
startForegroundService ist API26 oder höher </ font>
Notification notification = new Notification(
R.drawable.icon,
getText(R.string.ticker_text),
System.currentTimeMillis()
);
Intent notificationIntent = new Intent(this, ExampleActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
notification.setLatestEventInfo(
this,
getText(R.string.notification_title),
getText(R.string.notification_message),
pendingIntent);
startForeground(ONGOING_NOTIFICATION_ID, notification);
0 ist NG für die an startForeground () </ font> übergebene ID
Foregourd Service entfernen
stopForeground()
・ Entfernen Sie den Dienst aus dem Vordergrund
・ Wir akzeptieren auch Bool-Werte, die angeben, ob Benachrichtigungen entfernt werden sollen.
・ Der Dienst wird nicht beendet </ font>
Wenn der Dienst jedoch noch ausgeführt und im Vordergrund gestoppt wird, wird die Benachrichtigung entfernt.
Lebensdauermanagement
Kürzung
|
|
|
|