Oreo -> Stoppt Service

  • Hallo Leute,


    Ich habe ein Riesen Problem und finde keine Lösung bis jetzt!
    Ich habe eine GPS_Daten App, diese funktionierte noch wunderbar. Nun kam Oreo wieder ins Spiel und nun kann ich die App nicht mehr in den Hintergrund stecken ( was immer ging ).
    Minimiere ich die App stoppt mein Location-Service, öffne ich die App macht es wie gewohnt weiter.
    Da es mir aber nichts nützt und ich nebenbei noch andere Sachen mache, kann ich die App nicht immer wieder an drücken.
    Das ganze geht über einen Service


    Code
    public class GPS_Info extends Service {

    Hat jemand eine Idee wie ich dass ganze gefixt bekomme?


    Danke

  • Hi,


    habe das gleiche Problem mit meiner Stoppuhr. Der "Vordergrund-Service" wird nach einiger Zeit gekillt, wenn die App (Activity) aus der Liste der kürzlich verwendeten Apps entfernt wird. Habe schon Unmengen an Tutorials und Examples ausprobiert, aber bisher hat nichts geholfen - auch der AlarmManager und der JobScheduler nützen hier nichts. Sogar die Ausnahme der "Akku-Optimierung" hat keinen nennenswerten Erfolg gebracht.
    Einen Receiver habe ich auch probiert, aber auch das ist Erfolglos geblieben. Die einzige Chance die ich bisher gesehen habe ist es, die App nicht aus der Liste der kürzlich verwendeten Apps zu entfernen, aber das kann man den meisten Nutzern nur schwer erklären ..


    Hinweise nehme ich auch immer gerne entgegen.

  • Hi @michael hast mal unter android 8 mal getestet ob da auch ein im manifest erstellter Reciver vom System gekillt wird.
    Habe leider kein passendes Handy zu hand würde mich interessieren.


    Dabei auch eine Frage hast du Logik für die Uhr in der Activity oder in einem Service, Reciver?


    Für eine stoppuhr kannste dir aber auch die aktuelle System Zeit merken und wenn die App wieder sichtbar ist aktualisieren. Dafür müsste der Service nicht ständig laufen. Wenn du nicht zwischendurch irgend etwas im Hintergrund machen willst . Etwas senden zb.
    Denn die System Zeit läuft sowieso.

  • @michael ja es scheit besonders extrem bei den China Handys Huawei zu sein. Die müssen wohl besonders viel Akku sparen .


    Ein andere Ansatz währe mit Vordergrund Notification zu arbeiten. Und somit den Service am leben zu halten.
    Oder auch mit FCM Nachrichten zu arbeiten.

    Hi,


    von einer Vordergrund Notification habe ich noch nie gehört. Aber ich nutze einen Vordergrund Service der aber auch irgendwann vom System beendet wird.


    Zitat: https://developer.android.com/guide/components/services
    " if the service is declared to run in the foreground, it's rarely killed. "


    In meinem Fall habe ich es mit einem Android 8 (One Plus 3T) probiert. Das Verhalten ist immer das gleiche. Sobald keine Activity der App mehr existiert und das Gerät in den "Doze-Mode" geht, werden Services und Receiver beendet. Die Logik für die Stoppuhr ist komplett im Service implementiert.
    Das mit dem Merken der Zeit ist so eine Sache bei der App, da ich die Stoppuhr immer anzeige, auch wenn gerade eine andere App aktiv ist (klingt komisch, ist aber so).
    Kannst es Dir aber gerne auch mal Live ansehen https://play.google.com/store/…jentsch.floatingstopwatch
    Ich nutze die App beim Sport sehr gerne, da ich dann ein Video ansehen kann und gleichzeitig die Zeit im Auge behalten kann. Die App wird auch sehr gerne von Lehrern/Speakern genutzt, die dann ihre Zeiten im Auge behalten können und ihre Folien/Hints auf dem Handy/Tablet aufrufen können. In dem Fall ist das nicht so schlimm, da das Handy sich nicht abschaltet, aber bei langfristigen Zeit-Messungen ist das Beenden des Services schon doof.

  • Du wenn der Bildschirm an ist wird der Service nicht beendet wenn ich das richtig verstehe. Da kÖnntest du es ja so machen wie bisher und wenn der Bildschirm aus ist merkst du dir die aktuelle Zeit, Wenn der Bildschirm wieder an ist vergleichst du die Zeiten und setzt deine Uhr.
    Dazu musst du einen resiver erstellen der die Screen on off Meldung anfängt und du somit darauf reagieren kannst.

  • So hier ist die Lösung, endlich!!!!


    Code
    public Notification fakenr() {
            NotificationChannel Kanal = new NotificationChannel("Kanal1", "Bla kanal 1", NotificationManager.IMPORTANCE_DEFAULT);
            NotificationManager notificationManager = getSystemService(NotificationManager.class);
            notificationManager.createNotificationChannel(Kanal);
            Notification.Builder builder = new Notification.Builder(getApplicationContext(), "kanal1");
            return builder.build();
        }


    In OnCreate folgendermaßen aufrufen:



    Code
    startForeground(3123214, fakenr());

    Und boom es funtzt :)

  • Diese Lösung verwende ich auch, aber auf meinem Android 8 Handy wird der ForegroudService trotzdem unter bestimmten Bedingungen beendet.


    Wenn man die App aus der Liste der kürzliche verwendeten Apps entfernt und das Handy ca. 30 Minuten im ausgeschalteten Zustand (Ohne Ladegerät) nicht bewegt.


    Für dieses Problem habe ich noch keine Lösung gefunden, aber ist wohl auch eher die Ausnahme und so lange ich keine Lösung habe, lebe ich einfach damit und informiere den User darüber, dass er die App nicht beenden soll (In den Hintergrund schieben ist OK).

  • Hallo Micha
    hast du auch unter Oreo die Permission gesetst vorher brauchte man die nicht.



    Zitat

    Apps targeting API Build.VERSION_CODES.P or later must request the permission Manifest.permission.FOREGROUND_SERVICE in order to use this API.

    wenn du unter api 28 entwickelst soltest du die setzen.



    https://developer.android.com/reference/android/app/Service

  • Was ich noch gemacht habe:


    Die App aus der Überwachung entfernt.


    Und das hier:


    Code
    <activity android:name=".MainActivity" android:excludeFromRecents="true">


    Das versteckt die Activity. (Öffnen tue ich die App dann ganz normal über das Desktop Icon)
    Auch wenn ich sie Entferne aus kürzlich verwende Apps, läuft der Service weiter.
    Und bei mir funktioniert das jetzt wunderbar, die App rennt solange ich sie an lasse im HG.


    Und das habe ich nocht gemacht, das war's dann aber auch was mich zum Erfolg gebracht hat.



    Code
    if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {//wenn eine activity läuft, die alte starten keine neue
                finish();
                return;
            }


    Diese Lösung verwende ich auch, aber auf meinem Android 8 Handy wird der ForegroudService trotzdem unter bestimmten Bedingungen beendet.


    Wenn man die App aus der Liste der kürzliche verwendeten Apps entfernt und das Handy ca. 30 Minuten im ausgeschalteten Zustand (Ohne Ladegerät) nicht bewegt.


    Für dieses Problem habe ich noch keine Lösung gefunden, aber ist wohl auch eher die Ausnahme und so lange ich keine Lösung habe, lebe ich einfach damit und informiere den User darüber, dass er die App nicht beenden soll (In den Hintergrund schieben ist OK).

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!