Search code examples
javaandroidtimer

Android Work in Background?


I'm trying to develop a simple timer with Android Studio. Everything works fine, but my problem is:

When I close the App with the home button or lock the monitor, the app stops.

I read about Service, but is there no easier way to tell the app not to stop until the app get finally close?

Some code for help:

    //Hier wird runnable definiert. Sobald ein Handler gestartet wird mit dem Parameter runnable, wird diesse Methode ausgeführt.
    runnable = new Runnable() {
        //Setzt den Text der timeView auf timeInt und zählt timeInt hoch. (SOLL EIGENTLICH RUNTER ZÄHLEN)
        @Override
        public void run() {
            running = true;
            if (runde == 0) subtitle.setText("Exercise! Round " + realRound + " of " + satzAnz);
            timeView.setText(timeInt.toString());
            timeInt--;
            if (timeInt == 3 || timeInt == 1 || timeInt == 0) v.vibrate(500);
            if (timeInt == 2) {
                countdown.start();
                v.vibrate(500);
            }
            if (timeInt < 0 && (runde % 2 == 0)) {
                v.vibrate(1000);
                timeInt = pauseSec;
                subtitle.setText("Break...");
                runde++;
            }
            if (timeInt < 0 && (runde % 2 != 0)) {
                v.vibrate(1000);
                timeInt = satzdauerSec;
                realRound++;
                runde++;
                subtitle.setText("Exercise! Round " + realRound + " of " + satzAnz);
            }
            if (runde == (satzAnz*2)-1) {
                running = false;
                handler.removeCallbacks(runnable);
                timeInt = 0;
                showButton(start, false);
                showButton(stop, false);
                runde = 0;
                realRound = 0;
                v.vibrate(2000);
                subtitle.setText("Finish!");
            } else handler.postDelayed(this, 1000);
        }
    };

    //Dierser Runnable ist für den Anfangscountdown zuständig.
    countdownAtStart = new Runnable() {
        @Override
        public void run() {
            runningCountdown = true;
            if (startCountdown == 2 || startCountdown == 1 ) v.vibrate(500);
            if (startCountdown == 3) {
                countdown.start();
                v.vibrate(500);
            }
            if (startCountdown > 0) {
                timeView.setText(startCountdown.toString());
                startCountdown--;
                handler.postDelayed(this, 1000);
            } else {
                timeView.setText(startCountdown.toString());
                v.vibrate(1000);
                startCountdown = 15;
                runningCountdown = false;
                handler.removeCallbacks(countdownAtStart);
            }
        }
    };



    //Diese Methode beschreibt, was passiert wenn der Start-Button betätigt wird.
    start.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showButton(start, false);
            showButton(stop, true);
            showButton(reset, true);
            startService(intent);
            pause.setEnabled(false);
            satzdauer.setEnabled(false);
            satz.setEnabled(false);
            pauseSec = (Integer) pause.getSelectedItem();
            satzdauerSec = (Integer) satzdauer.getSelectedItem();
            satzAnz = (Integer) satz.getSelectedItem();
            timeInt = satzdauerSec;
            subtitle.setText("Start Countdown");
            handler.postDelayed(countdownAtStart, 0);
            handler.postDelayed(runnable, 16000);
        }
    });

    //Diese Methode beschreibt, was passiert wenn der Stop-Button betätigt wird.
    stop.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            handler.removeCallbacks(countdownAtStart);
            handler.removeCallbacks(runnable);
            Boolean runningCountdown = false;
            Boolean running = false;
            showButton(start, true);
            showButton(stop, false);
        }
    });

    //Diese Methode beschreibt, was passiert wenn der Reset-Button betätigt wird.
    reset.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            timeInt = satzdauerSec;
            timeView.setText(timeInt.toString());
            handler.removeCallbacks(countdownAtStart);
            handler.removeCallbacks(runnable);
            showButton(start, true);
            showButton(stop, false);
            showButton(reset, false);
            pause.setEnabled(true);
            satzdauer.setEnabled(true);
            satz.setEnabled(true);
            startCountdown = 15;
            subtitle.setText("get ready");
            Boolean runningCountdown = false;
            Boolean running = false;
        }
    });

}

Solution

  • You can use AsyncTask. It will not stop even if your app goes to background. It will only stop once its job is done or explicitly cancelled.