Ich bin mir also nicht sicher, wo / wie ich diese Methode implementieren soll, damit mein Dienst im Vordergrund ausgeführt wird. Derzeit beginne ich meinen Dienst wie folgt in einer anderen Aktivität:
Intent i = new Intent(context, myService.class);
context.startService(i);
Und dann versuche ich in onCreate () von myServices startForeground () ...?
Notification notification = new Notification();
startForeground(1, notification);
Also ja, ich bin ein bisschen verloren und unsicher, wie ich das umsetzen soll.
Antworten:
Ich würde damit beginnen, das vollständig auszufüllen
Notification
. Hier ist ein Beispielprojekt , das die Verwendung von demonstriertstartForeground()
.quelle
1337
?Starten Sie den Dienst von Ihrer Hauptaktivität aus mit dem folgenden Code:
Dann würden Sie in Ihrem Dienst für
onCreate()
Sie Ihre Benachrichtigung erstellen und sie wie folgt in den Vordergrund stellen:quelle
Dies ist mein Code, um den Dienst in den Vordergrund zu stellen:
Ich muss eine Benachrichtigung mit PendingIntent erstellen, damit ich meine Hauptaktivität von der Benachrichtigung aus starten kann.
Um die Benachrichtigung zu entfernen, rufen Sie einfach stopForeground (true) auf.
Es wird im onStartCommand () aufgerufen. Bitte beziehen Sie sich auf meinen Code unter: https://github.com/bearstand/greyparrot/blob/master/src/com/xiong/richard/greyparrot/Mp3Recorder.java
quelle
Intent.FLAG_ACTIVITY_NEW_TASK
ist nicht gültig im Kontext vonPendingIntent
.Lösung für Oreo 8.1
Ich habe einige Probleme wie RemoteServiceException aufgrund einer ungültigen Kanal-ID mit den neuesten Versionen von Android festgestellt . So habe ich es gelöst:
Aktivität :
BackgroundService:
JAVA ÄQUIVALENT
quelle
ContextCompat.startForegroundService(Context,Intent)
in Ihrer Aktivität verwenden, was das Richtige tut. ( developer.android.com/reference/android/support/v4/content/… ).setCategory(NotificationCompat.CATEGORY_SERVICE)
anstatt,Notification.CATEGORY_SERVICE
wenn Ihre min API <21Build.VERSION_CODES.P
(API-Stufe 28) oder höher die Erlaubnis anfordern mussManifest.permission.FOREGROUND_SERVICE
, um verwendet zu werdenstartForeground()
- siehe developer.android.com/reference/android/app/…Zusätzlich zur RAWA- Antwort bietet dieser Code-Frieden:
Sie können ändern zu:
Wenn Sie sich diese Methode ansehen, können Sie sehen, dass diese Methode alle Überprüfungsarbeiten für Sie erledigt.
quelle
Wenn Sie IntentService zu einem Vordergrunddienst machen möchten
dann sollten Sie außer Kraft setzen ,
onHandleIntent()
wie diesWie mache ich eine Benachrichtigung?
einfach. Hier ist die
getNotification()
MethodeTieferes Verständnis
Was passiert, wenn ein Dienst zu einem Vordergrunddienst wird?
Was ist ein Vordergrunddienst?
Ein Vordergrunddienst,
stellt sicher, dass der Benutzer aktiv weiß, dass im Hintergrund etwas passiert, indem er die Benachrichtigung bereitstellt.
(am wichtigsten) wird vom System nicht beendet, wenn der Arbeitsspeicher knapp wird
Ein Anwendungsfall für den Vordergrunddienst
Implementieren der Song-Download-Funktion in einer Musik-App
quelle
Fügen Sie die angegebene Code-Serviceklasse für "OS> = Build.VERSION_CODES.O" in onCreate () hinzu.
Fügen Sie diese Berechtigung in die Manifestdatei ein:
quelle
Behandeln Sie die Absicht auf startCommand of Service mithilfe von.
Durch diesen Aufruf wird der Dienst aus dem Vordergrundstatus entfernt , sodass er beendet werden kann, wenn mehr Speicher benötigt wird. Dies verhindert nicht, dass der Dienst ausgeführt wird. Dazu müssen Sie stopSelf () oder verwandte Methoden aufrufen .
Wenn Sie den Wert true oder false übergeben, wird angezeigt, ob Sie die Benachrichtigung entfernen möchten oder nicht.
Erledige deine Aufgabe, wenn bei destroy von stopSelf () aufgerufen wird .
Erstellen Sie eine Benachrichtigung, um den Dienst im Vordergrund zu halten.
Geben Sie bei der Benachrichtigung eine Stopp-Schaltfläche ein, um den Dienst zu beenden, wenn der Benutzer dies benötigt.
quelle
Hinweis: Wenn Ihre App auf API-Level 26 oder höher abzielt, legt das System Einschränkungen für die Verwendung oder Erstellung von Hintergrunddiensten fest, es sei denn, die App selbst steht im Vordergrund.
Wenn eine App einen Vordergrunddienst erstellen muss, sollte die App aufrufen
startForegroundService()
. Diese Methode erstellt einen Hintergrunddienst, aber die Methode signalisiert dem System, dass der Dienst sich selbst in den Vordergrund stellt.Sobald der Dienst erstellt wurde, muss der Dienst seine aufrufen
startForeground() method within five seconds.
quelle
startForegroundService
MethodeIn meinem Fall war es völlig anders, da ich keine Aktivität hatte, um den Dienst in Oreo zu starten.
Im Folgenden sind die Schritte aufgeführt, mit denen ich dieses Problem mit dem Vordergrunddienst behoben habe:
Und danach, um diesen Dienst zu initiieren, habe ich unter cmd ausgelöst -
Die Shell adb -s "+ serial_id +" ist startforegroundservice -n com.test.socket.sample / .SocketService
Dies hilft mir also, den Dienst ohne Aktivität auf Oreo-Geräten zu starten :)
quelle
@mikebertiean Lösung hat fast den Trick getan, aber ich hatte dieses Problem mit zusätzlichen Twist - ich verwende Gingerbread-System und ich wollte kein zusätzliches Paket hinzufügen, nur um die Benachrichtigung auszuführen. Endlich fand ich: https://android.googlesource.com/platform/frameworks/support.git+/f9fd97499795cd47473f0344e00db9c9837eea36/v4/gingerbread/android/support/v4/app/NotificationCompatGingerbread.java
dann stoße ich auf ein zusätzliches Problem - Benachrichtigung beendet einfach meine App, wenn sie ausgeführt wird (wie man dieses Problem löst: Android: So vermeidet man, dass das Klicken auf eine Benachrichtigung onCreate () aufruft ), sodass mein Code im Dienst insgesamt so aussieht (C # / Xamarin):
quelle