[JAVA] Programmierung ab 51 Jahren Hinweis: Einschränkungen bei der Hintergrundausführung OverView [Shakyo]

https://developer.android.com/about/versions/oreo/background?hl=ja

[Shakyo]: Für mich

Hintergrundbegrenzung

Um ein unerwartetes Herunterfahren der App aufgrund von Systemlast usw. zu vermeiden, wird der Ausführungsvorgang der App eingeschränkt, wenn die App nicht direkt betrieben wird. Es gibt zwei Möglichkeiten, dies zu begrenzen.

Einschränkungen des Hintergrunddienstes

Broadcast-Limit

Für Android 7.0 (API 24) oder höher gelten Einschränkungen, und für Android 8.0 (API 26) werden die Einschränkungen verschärft.

Mit wenigen Ausnahmen

--Apps können keine Manifeste verwenden, um implizite Broadcasts zu registrieren.

Limits und API-Levels

Hinweis:
Standardmäßig gelten diese Einschränkungen nur für Apps, die auf Android 8.0 (API 26) oder höher abzielen.
Benutzer können jedoch die meisten dieser Einschränkungen für ihre Apps auf dem Einstellungsbildschirm aktivieren, selbst wenn die App auf weniger als API 26 abzielt. (Durch das Einschränken wird die Qualität der Benutzererfahrung sichergestellt.)

In vielen Fällen kann die App die Einschränkung mit JobScheduler </ font> umgehen.

Mit JobScheduler </ font> können Sie Maßnahmen ergreifen, wenn die App inaktiv ist. Sie können die Aktion jedoch auch so planen, dass sie die Benutzererfahrung nicht beeinträchtigt.

Android 8.0 fügt JobScheduler </ font> einige Verbesserungen hinzu, die es einfach machen, Dienste und Rundfunkempfänger durch geplante Jobs zu ersetzen. Weitere Informationen finden Sie unter JobScheduler-Verbesserungen.

JobScheduler: </ strong>
Ein Zeitplandienst, der Aufgaben verwaltet, damit verschiedene Prozesse effizient ausgeführt werden können. </ font>

Hintergrund-Service-Limits

Wenn im Vordergrund betrachtet

  • Es ist eine Aktivität sichtbar (möglicherweise angehalten) --Verwenden Sie den Vordergrunddienst
  • Die App ist mit einer anderen Vordergrund-App verbunden und an einen der Dienste der Vordergrund-App gebunden
  • Die App ist mit einer anderen Vordergrund-App verbunden und verwendet den Inhaltsanbieter der Vordergrund-App
    = Beispiel für das Binden anderer Vordergrund-Apps =
  • IME
  • Wallpaper service
  • Notification listener
  • Voice or text service

In jedem anderen Zustand wird die App als Hintergrundverarbeitung betrachtet.

Note:
Die oben genannten Regeln gelten nicht für gebundene Dienste. Wenn Ihre App einen gebundenen Dienst definiert, können Sie eine andere Komponente an diesen Dienst binden, unabhängig davon, ob Ihre App im Vordergrund steht oder nicht.

Systembeendigung von Hintergrund-Apps

Sie können Vordergrund- und Hintergrunddienste generieren und ausführen, während Ihre App im Vordergrund ausgeführt wird. Wenn die App in den Hintergrund tritt, kann es sich leisten, Dienste nur wenige Minuten lang zu generieren und auszuführen. Danach stellt das System fest, dass die App inaktiv ist und Service.stopSelf. Beenden Sie den Hintergrunddienst der App, z. B. bei Verwendung der Methode () </ font>.

Zur Whitelist der Apps hinzufügen

Die Bedingung für die Whitelist der App ist, dass der Benutzer die folgende sichtbare Verarbeitung ausführt.

Unter bestimmten Bedingungen werden Hintergrund-Apps auf einer temporären Whitelist abgelegt, können Dienste für einige Minuten kostenlos starten und ausgeführt werden.

  • Firebase Cloud Messageing (FCM) </ font> -Nachrichtenverarbeitung mit hoher Priorität
  • Empfangen von Sendungen (SMS / MMS-Nachrichten usw.)
  • Führen Sie PendingIntent von der Benachrichtigung aus
  • Das Starten von VpnService vor der VPN-App fördert das Vertrauen in den Vordergrund

IntentService / JobIntentService und Android 8.0 oder höher

Beim Umgang mit Hintergrunddiensten in IntentService

Note:
Da IntentService ein Dienst ist, unterliegt er neuen Einschränkungen für Hintergrunddienste. Daher funktionieren Apps, die von IntentService abhängen, unter Android 8.0 oder höher nicht ordnungsgemäß.

Aus diesem Grund führt die Android Support Library 26.0.0 eine neue JobIntentService-Klasse ein. Diese Klasse bietet die gleiche Funktionalität wie IntentService , verwendet jedoch Jobs anstelle von Services , wenn sie unter Android 8.0 und höher ausgeführt wird.

JobScheduler In vielen Fällen ersetzen Apps Hintergrunddienste durch JobScheduler </ font> -Jobs (z. B. bei der Migration auf Android 8.0: API 26 oder höher). Geplante Jobs werden regelmäßig gestartet, der Server abgefragt und beendet.

Generierung von Hintergrunddiensten um Android 8.0

In Android 8.0 und früheren Versionen können Sie einen Hintergrunddienst erstellen, indem Sie einen Hintergrunddienst erstellen und diesen Dienst dann in den Vordergrund stellen.

Ab Android 8.0 können Hintergrund-Apps keine Hintergrunddienste mehr erstellen. Stattdessen wurde eine startForegroundService () </ font> -Methode eingeführt, mit der ein neuer Dienst im Vordergrund gestartet wird.

Nach dem Ausführen von startForegroundService () </ font> wird startForeground () </ font> </ strong> innerhalb von 5 Sekunden aufgerufen. Benutzerbenachrichtigungen über neue Dienste anzeigen. Wenn die App startForeground () </ font> nicht innerhalb des Zeitlimits aufruft, beendet das System den Dienst und die App ist ANR (Anwendung antwortet nicht).

Broadcast-Einschränkungen entfallen

Migration

Erfahren Sie, wie Sie Hintergrundbeschränkungen für weniger als API 26 anwenden. Durch das Festlegen von Hintergrundbeschränkungen bleibt die Qualität der Benutzererfahrung erhalten.

Selbst wenn die API kleiner als 26 ist, können Sie Einschränkungen für die App auf dem Bildschirm ** [Einstellungen] ** aktivieren. Neu Möglicherweise müssen Sie Ihre App aktualisieren, um die Einschränkungen zu erfüllen.

Wenn Sie ersetzen müssen

  • Abhängig von der Verarbeitung von Hintergrunddiensten, wenn die App inaktiv ist
  • Deklarieren eines Empfängers für implizite Sendungen im Manifest

Wenn eine App inaktiv ist und auf die Verarbeitung von Hintergrunddiensten angewiesen ist, müssen diese Dienste ersetzt werden.

** **

--Wenn sich die App im Hintergrund befindet und Sie einen Vordergrunddienst erstellen möchten
startForegroundService </ font> -Methode, startService () </ font> Verwenden Sie statt, um Vordergrunddienste zu generieren

  • Der dem Benutzer angezeigte Dienst sollte ein Vordergrunddienst sein.
    Verwenden Sie die Methode startForegroundService </ font> anstelle von startService () </ font>. Verwenden Sie diese Option, um einen Vordergrunddienst zu generieren

  • Doppelte Dienstfunktionalität mit geplanten Jobs
    Verwenden Sie geplante Jobs im Allgemeinen als Alternative zu Diensten, die nicht in einer vom Benutzer erkennbaren Situation ausgeführt werden.

  • </ font> Verwenden Sie FCM, um Apps selektiv zu starten, wenn Netzwerkereignisse auftreten, ohne im Hintergrund abzufragen.
    Polling: Fragen Sie in regelmäßigen Abständen andere Systeme ab </ font>

--Halten Sie den Hintergrundbetrieb, bis die App natürlich im Vordergrund steht


Überprüfen Sie den im Manifest der App definierten Rundfunkempfänger. Wenn das Manifest einen Empfänger für implizite Sendungen deklariert, müssen Sie ihn ersetzen. Mögliche Lösungen sind:

** **

  • Anstatt den Empfänger im Manifest zu deklarieren, rufen Sie Context.registerReceiver () </ font> auf, um den Empfänger zur Laufzeit zu erstellen

  • Verwenden Sie einen geplanten Job, um die impliziten Broadcast-Triggerbedingungen anzuzeigen

Recommended Posts