1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

App läuft permanent im HIntergrund - oder doch nicht?

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von renegade2k, 21.07.2012.

  1. renegade2k, 21.07.2012 #1
    renegade2k

    renegade2k Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    94
    Erhaltene Danke:
    4
    Registriert seit:
    06.01.2010
    Phone:
    HTC Sensation
    Ich habe eine relativ simple App geschrieben, die eine Haupt-Activity und ein Service hat, der die eigene Position verfolgt.

    Wenn die App gestartet wird und die Haupt-Activity geladen wird, wird "onCreate" der Service gestartet.
    Code:
    startService(new Intent(this, Track.class));
    Die Track.class ist in der AndroidManifest auch als Service eingetragen
    Code:
    <service android:name=".Track" />
    In dem Service wird "onCreate" die Ortung gestartet
    Code:
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
     locationListener = new mylocationlistener();
     locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
    Anschließend werden ein paar einfache Berechnungen durchgeführt, für die ich die Methoden selbst geschrieben habe.

    Nun,wenn die App beendet wird (mit eine Button, der in der Haupt-Activity finish() aufruft), wird zunächst in der Haupt-Activity der Service abgemeldet
    Code:
    public void onDestroy() {
            super.onDestroy();
            stopService(new Intent(Main.this, Track.class));
        }
    Und im Service wird der LocationListener abgemeldet
    Code:
    public void onDestroy() {
            super.onDestroy();
            locationManager.removeUpdates(locationListener);
        }
    Ich habe in allen Methoden (location listener, alle meine selbst geschriebenen Methoden, in onCreate und onDestroy etc.)Debug-Nachrichten drin, sodass, wenn eine der Methoden ausgeführt wird, ich es in Logcat sofort sehe.
    Und es ist nach dem Beenden nichts zu sehen!
    Dennoch, wenn ich im Anwendungs-Menü von Android nachsehe, steht meine App als "ausgeführt" drin. Bzw. der Button "beenden erzwingen" ist durchgehend aktiv.
    Auch wenn ich die Ap anschließend erneut starte, sind alle vorher vorgenommenen EIngaben gelöscht. Die Activity wird also ganz "frisch" erstellt.

    Übersehe ich noch irgend etwas?
    Und habe ich die Möglichkeit irgendwie zu sehen, was von der App noch im Hintergrund läuft? Denn wie erwähnt, habe ich ja eigentlich jede Methode markiert und keine von denen wird aufgerufen.
    Oder ist es normal, dass die App an sich noch in der Liste auftaucht, bis Android sie irgendwann selbst beendet?
     
    Zuletzt bearbeitet: 21.07.2012
  2. swordi, 21.07.2012 #2
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    eine app wird erst komplett beendet, wenn android es für richtig hält.
     
  3. renegade2k, 21.07.2012 #3
    renegade2k

    renegade2k Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    94
    Erhaltene Danke:
    4
    Registriert seit:
    06.01.2010
    Phone:
    HTC Sensation
    Theoretisch ja schon.
    Irgendwo las ich mal "leerer Speicher ist schlechter Speicher".

    Dennoch macht es mich etwas stutzig.
    Andere Apps sind ja auch, wenn man sie beendet, aus der Liste ausgeführter Apps raus.

    Ich hatte jetzt so die Befürchtung, dass irgendwie noch der Listener im Hintergrund läuft, was dann natürlich zu ungewollten Energieverbrauch führen würde.

    Ich weiss aber auch, dass es ein gewissen unterschied zwischen laufenden und aktiven Apps gibt. Nur weiss ich nicht, wie ich diesen erkenne. Also ob meine App nur "tot" im Speicher liegt, oder ob sie noch etwas macht.
    Beim beenden wird definitiv "onDestroy" sowohl von der Activity, als auch vom Service aufgerufen, so viel kann ich sagen.
     
    Zuletzt bearbeitet: 21.07.2012
  4. eki89, 22.07.2012 #4
    eki89

    eki89 Junior Mitglied

    Beiträge:
    30
    Erhaltene Danke:
    8
    Registriert seit:
    02.06.2011
    Phone:
    HTC Desire HD
    :lol: Das ist vom Context abhängig. Wird die Instanz nicht mehr benötigt, ist sie sogar schlecht, da bei Speichermangel wertvoller Speicher blockiert ist, der von anderen Prozessen sinnvoll genutzt werden könnte.
    Wird die onDestroy-Methode des Services wirklich aufgerufen? Die einzige zuverlässige Methode ist die onPause-Methode. Ich weiß allerdings nicht genau wie es bei einem Service aussieht. Die onDestroy-Mehtode wird meiner Meinung nach nur aufgerufen, wenn die App richtig gekillt wird, bzw. Android entscheidet, das die App nicht mehr benötigt wird. Ist dies der Fall beendet Android den Prozess und ruft dabei außerdem die onDestroy-Methode auf. Hier ist ein Auszug aus dem Developer-Portal.
    Hier der link.
    Wird kein Hintergrund-Thread gestartet belegt die App lediglich Speicher im Hauptspeicher. Kannst ja mal an ein Paar stellen deiner App ins Log schreiben, die App dann starten und dann den Fokus der Aktivity verlassen. Die einzigen Methoden die dann augeführt werden sind Methoden, die von Android aufgerufen werden, z.B. weil die App länger nicht mehr im Vordergrund war. Das sind dann ausschließlich Methoden wie onPause, onStop oder onDestroy.
    Ruft die stopService-Methode wirklich die onDestroy-Methode des referenzierten Services auf. Ich bin mir ein wenig unsicher. Habe mein Smartphone gerade mal neu gestartet und sehe gerade, das sämtliche Prozesse mit gestartet wurden, also von sämtlichen Apps.
    Werde mich bei Gelegenheit mal einlesen und sage dir dann bescheid. Solltest du was herausfinden würde ich mich freuen wenn du davon berichten könntest.
     
  5. renegade2k, 22.07.2012 #5
    renegade2k

    renegade2k Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    94
    Erhaltene Danke:
    4
    Registriert seit:
    06.01.2010
    Phone:
    HTC Sensation
    Ja, definitiv werden beide aufgerufen.
    Ich habe in beiden onDestroy eine Log-Nachricht gehabt, die ich dann beim Beenden angezeigt kriege.

    Seltsam ich aber auch, beim Neustart der App werden alle Eingabefelder zurück gesetzt.
    In einigen Fällen aber, die ich so nicht mit Sicherheit reproduzieren kann, bleiben die berechneten Ausgaben stehen.
    Es wird also augenscheinlich die Activity neu erstellt, die Objekte, die aber während des letzten Aufrufs erstellt wurden bleiben weiterhin bestehen.

    Wenn ich nun ganz "hardcore" in das onDestroy "System.exit(0);" rein schreibe, beendet sich wohl die App, wie es soll. Sowas sollte man aber vermeiden, soweit ich es gelesen habe, da man damit wieder in dieses automatische Managrement des Speichers von Android eingreift
     

Diese Seite empfehlen