Reputation: 755
I am working on a libGDX app that include a timer. I need the timer to be running even if the home button is pressed, and even if the screen is turned off by pressing the onoff button.
For that I thought about preventing the app to go in the paused state. In the AndroidLauncher.java I add this lines of code :
@Override
public void onPause() {
onResume();
}
The idea is to resume the app as soon as it goes in the paused state.
Here is the logcat of the app after pressing the home button and going back to the app :
01-26 18:17:25.125: I/AndroidInput(2753): sensor listener setup
01-26 18:17:25.126: I/AndroidGraphics(2753): resumed
01-26 18:17:25.191: W/IInputConnectionWrapper(2753): showStatusIcon on inactive InputConnection
01-26 18:17:28.899: I/AndroidInput(2753): sensor
01-26 18:17:28.919: I/AndroidGraphics(2753): resumed
As you can see, when the app is running, if I press the home button, the app resumes, without going on paused state, and when I go back to the app it resumes again. But, the timer is stopped...
Why the timer stopped while the app never whent in the paused state ? And finally, how can I keep the timer running after pressing the home button ?
Thanks
Edit : So I started to use the services and I still encounter problems to have the timer running in background.
Here is the startegy :
Code :
Timer in the GameScreen.java :
timer = new Timer();
timer.scheduleTask(new Task(){
public void run() {
timerSeconds--;
}
}, 1,1);
Interface ActionResolver.java :
public interface ActionResolver {
public void backgroundTimer(int a);
}
The ActionResolver is called in the main activity MyGdxGame.java :
@Override
public void pause() {
super.pause();
actionResolver.backgroundTimer(GameScreen.timerSeconds);
}
The backgroundTimer method is deffined in the AndroidLauncher :
@Override
public void backgroundTimer(int a) {
aa = a;
Intent intentTimer = new Intent(AndroidLauncher.this, IntentServiceTimer.class);
intentTimer.putExtra(TIMER, aa);
startService(intentTimer);
}
Then I created the intentServiceTimer class :
public class IntentServiceTimer extends IntentService{
private final static String TAG = "IntentServiceExample";
int a;
public IntentServiceTimer(){
super(TAG);
}
@Override
protected void onHandleIntent(final Intent intent) {
Log.d(TAG, "When the game went on pause, the number of remaining seconds was : " + intent.getIntExtra(AndroidLauncher.TIMER, -1));
a = intent.getIntExtra(AndroidLauncher.TIMER, -1);
Timer timer = new Timer();
timer.scheduleTask(new Task(){
public void run() {
a--;
Log.d(TAG, "Seconds remaining : " + a);
}
}, 1,1);
}
}
In the AndroidManifest.xml I declared the service :
<service android:name="IntentServiceTimer"/>
Results :
When I lunch the app, this line of the Service prints the right message as soon as the game goes in paused state, which is good :
Log.d(TAG, "When the game went on pause, the number of remaining seconds was : " + intent.getIntExtra(AndroidLauncher.TIMER, -1));
But, the timer loop, which includes the countdown and a print of this countdown every seconds, seems to doesn't work, as nothing prints in the console. But, if I go back to the app, the countown prints, in one time, every seconds that the game was in paused state. For example if I put the game in paused state for 5 seconds, as soon as I go back to the app it will print :
Seconds remaining : 27
Seconds remaining : 26
Seconds remaining : 25
Seconds remaining : 24
Seconds remaining : 23
So I have this weird behavior of the service :
Do you have any idea about that problem ? I still didn't check the alarmmanager, as I'll need to have more elaborate process running in the background, in the future, the services seem to be what I need.
Upvotes: 0
Views: 1185
Reputation: 755
OK ! So, after getting mad all the day with this problem, I finally found the (very easy) solution :
In the edit of my initial question I started working with Services, but I had a very weird behavior of the service. My problem came from the fact that in my IntentService class I used the Timer() and Task() method from libgdx package.
I just replaced these two classes with there equivalent Timer() and TimerTask() method from java.util package, and eveything works smoothly !
So now, my IntentServiceTimer looks like that :
import java.util.Timer;
import java.util.TimerTask;
import android.app.IntentService;
import android.content.Intent;
import android.util.Log;
public class IntentServiceTimer extends IntentService{
private final static String TAG = "IntentServiceExample";
int a;
public IntentServiceTimer(){
super(TAG);
}
@Override
protected void onHandleIntent(final Intent intent) {
Log.d(TAG, "When the game went on pause, the number of remaining seconds was : " + intent.getIntExtra(AndroidLauncher.TIMER, -1));
a = intent.getIntExtra(AndroidLauncher.TIMER, -1);
Timer timer = new Timer();
timer.schedule(new TimerTask(){
public void run() {
a--;
Log.d(TAG, "Seconds remaining : " + a);
}
}, 1,1);
}
}
Upvotes: 1
Reputation: 6631
You should use a service to solve this: Services
Other method that is called when you press some of three soft button is onUserLeaveHint, but it can't solve your problem, by the way you can use it in future sure:
protected void onUserLeaveHint() {
super.onUserLeaveHint();
}
Upvotes: 3