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;
}
});
}
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.