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

Service einer App wird mit GUI vom System abgeschossen

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von bruegae, 25.10.2011.

  1. bruegae, 25.10.2011 #1
    bruegae

    bruegae Threadstarter Neuer Benutzer

    Beiträge:
    7
    Erhaltene Danke:
    0
    Registriert seit:
    27.07.2011
    Hallo zusammen,
    meine App verwendet einige Activities sowie einen Service. Der Service soll ein solcher sein, der immer läuft und nur bei Speichermangel beendet werden soll.
    Wenn ich normal mit dem Home-Button auf den Startbildschirm zurückkehre, kann ich im "TaskManager" meine App noch als laufendes Programm finden. Ebenso unter Einstellungen -> Anwendungen -> laufende Dienste ist mein Service zu finden.
    Nach einiger Zeit kicket das Android System mein Programm aus der "Aktive Anwendungen" Liste im Taskmanager. So solls ja sein. Allerdings wird damit gleichzeitig auch mein Service gekillt. Das möchte ich aber nicht! Der soll für immer und ewig laufen, völlig unabhängig von den Activities.

    Hier der Code von meinem Service:
    Code:
    public class SilenceService extends Service {
    
        private volatile boolean threadsRunning = false;
        private int startId;
        
    
        @Override
        public IBinder onBind(Intent arg0) {
            return null;
        }
    
        @Override
        public void onCreate() {
            
            Log.d("ASD", "ss start cmd");
            threadsRunning = true;
    
            Thread thread1 = new Thread(new Runnable() {
    
                @Override
                public void run() {
                    
    
                    while (threadsRunning) {
                        preferences.loadFromDB();
    
                        try {
    
                                work();
                                // HIER WIRD GEARBEITET
                                
                                Thread.sleep(preferences.getCheckintervalInSeconds() * 1000);
    
    
                        } catch (InterruptedException e) {
                            Log.d("ASD", "SERVICE SLEEP EXcEPTION");
                        }
                    }
                }
            });
    
            thread1.start();
            super.onCreate();
        }
        
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            this.startId = startId;
    
            return START_REDELIVER_INTENT;
        }
    
        private void stop() {
            Log.d("ASD", "SERVICE stop");
            stopSelf(startId);
        }
    
        @Override
        public void onDestroy() {
            threadsRunning = false;
            Log.d("ASD", "SERVICE destroy");
            super.onDestroy();
        }
    }
    So starte ich den Service (aktuell noch manuell durch einen Buttonclick in einer der Activities):
    Code:
    startService(new Intent(thisContext, SilenceService.class));
     
  2. Neeldarax, 26.10.2011 #2
    Neeldarax

    Neeldarax Erfahrener Benutzer

    Beiträge:
    170
    Erhaltene Danke:
    31
    Registriert seit:
    07.12.2010
    Hallo bruegae,

    dein Service wird aus der Activity gestertet und beendet sich mit deiner APP.

    QUELLE - das hab ich wo gefunden gehabt.

    Wenn es eine Möglichkeit gibt dein BroadcastReceiver ewig am Start zu haben, sollte es eig. auch mit einem Service gehen. Kenn gerad die Lösung nicht, aber dein Problem sollte damit erklärt sein - StartService(..) ist nicht der passende Ansatz.

    regards
     
  3. JanF, 26.10.2011 #3
    JanF

    JanF Android-Experte

    Beiträge:
    594
    Erhaltene Danke:
    79
    Registriert seit:
    31.03.2011
    Probier es mal mit startForeground(int, Notification)

    Mehr Details und Quelle:
    Service | Android Developers
     
  4. bruegae, 26.10.2011 #4
    bruegae

    bruegae Threadstarter Neuer Benutzer

    Beiträge:
    7
    Erhaltene Danke:
    0
    Registriert seit:
    27.07.2011
    Also wenn ein Dienst beendet werden würde, wenn die zugehörige Anwendung beendet wird, wäre das Ganze ja irgendwie sinnlos. Das wäre ja wie wenn der Search Indexer Service von Windows nur laufen würde wenn man aktuell gerade etwas sucht. Dann wäre das ganze Dienst-Konzept ja irgendwie sinnlos?

    Mit startForeground habe ich es tatsächlich geschafft meinen Dienst über Nacht am Leben zu erhalten, wärend das Programm im Task Manager verschwunden ist.
    Auf startForeground bin ich gestern abend noch gestoßen, aber trotzdem Danke an JanF!!
     

Diese Seite empfehlen