vdlmrc
vdlmrc

Reputation: 755

How to prevent onPause() when pressing home button?

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

Answers (2)

vdlmrc
vdlmrc

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

JavierSegoviaCordoba
JavierSegoviaCordoba

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

Related Questions