按主页按钮时如何防止onPause()?

时间:2015-01-26 23:24:55

标签: java android libgdx onpause

我正在开发一个包含计时器的libGDX应用程序。即使按下主页按钮,我也需要定时器运行,即使按下开关按钮关闭屏幕也是如此。

为此,我考虑阻止应用程序进入暂停状态。 在AndroidLauncher.java中,我添加了以下代码行:

@Override
  public void onPause() {
        onResume();
  }

这个想法是在应用程序进入暂停状态后立即恢复该应用程序。

按下主页按钮并返回应用程序后,这是应用程序的logcat:

  

01-26 18:17:25.125:I / AndroidInput(2753):传感器监听器设置

     

01-26 18:17:25.126:I / AndroidGraphics(2753):已恢复

     

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):已恢复

正如您所看到的,当应用程序运行时,如果我按下主页按钮,应用程序将恢复,而不会进入暂停状态,当我返回应用程序时,它会再次恢复。但是,计时器停止了......

为什么计时器在应用程序永远不会处于暂停状态时停止? 最后,如何在按下主页按钮后保持定时器运行?

由于


修改: 所以我开始使用这些服务,我仍然遇到问题,让计时器在后台运行。

以下是佼佼者:

  • 在我的GameScreen中,我有一个计时器,我可以在其中输入一些 秒,
  • 然后我使用任务倒数到0。
  • 当我正在开发一个libGDX项目时,我使用了一个接口 将当前秒数传达给AndroidLauncher, 当比赛进入暂停状态时。
  • 该界面还会触发一个保持倒计时的服务 使用相同的计时器和任务运行,并且每秒在consol中打印当前秒数。

代码:

GameScreen.java中的计时器:

timer = new Timer();
timer.scheduleTask(new Task(){
        public void run() {
            timerSeconds--;
        }
    }, 1,1);

接口ActionResolver.java:

public interface ActionResolver {
    public void backgroundTimer(int a);
}

在主要活动MyGdxGame.java中调用ActionResolver:

@Override
public void pause() {
    super.pause();
    actionResolver.backgroundTimer(GameScreen.timerSeconds);
}

在AndroidLauncher中定义了backgroundTimer方法:

@Override
public void backgroundTimer(int a) {
    aa = a;

    Intent intentTimer = new Intent(AndroidLauncher.this, IntentServiceTimer.class);
    intentTimer.putExtra(TIMER, aa);
    startService(intentTimer);
}

然后我创建了intentServiceTimer类:

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

在AndroidManifest.xml中我声明了服务:

<service android:name="IntentServiceTimer"/>

结果:

当我在应用程序中午餐时,一旦游戏进入暂停状态,此服务线就会打印出正确的消息,这很好:

Log.d(TAG, "When the game went on pause, the number of remaining seconds was : " + intent.getIntExtra(AndroidLauncher.TIMER, -1));

但是,定时器循环,包括倒计时和每秒倒计时打印,似乎不起作用,因为控制台中没有打印。但是,如果我回到应用程序,计数会在一次打印游戏处于暂停状态的每一秒。例如,如果我将游戏置于暂停状态5秒钟,那么一旦我回到应用程序,它就会打印出来:

  

剩下的秒数:27

     

剩下的秒数:26

     

剩余秒数:25

     

剩下的秒数:24

     

剩下的秒数:23

所以我有这种奇怪的服务行为:

  • 在预期时(当游戏进入暂停状态时)打印第一条消息
  • 倒计时似乎在后台运行
  • 倒计时的结果仅在恢复
  • 时打印

你对这个问题有什么看法吗? 我仍然没有检查警报管理员,因为我需要在后台运行更复杂的过程,将来,服务似乎是我需要的。

2 个答案:

答案 0 :(得分:3)

您应该使用服务来解决此问题:Services

按下三个软键中的一些时调用的其他方法是onUserLeaveHint,但它无法解决您的问题,以便您将来可以使用它确定:

    protected void onUserLeaveHint() {
        super.onUserLeaveHint();
    }

答案 1 :(得分:1)

好的!所以,在这个问题一整天都生气之后,我终于找到了(非常简单的)解决方案:

在我最初的问题的编辑中,我开始使用服务,但我有一个非常奇怪的服务行为。我的问题来自于我在IntentService类中使用了libgdx包中的Timer()和Task()方法。

我刚用java.util包中的等效Timer()和TimerTask()方法替换了这两个类,并且eveything工作顺利!

现在,我的IntentServiceTimer看起来像这样:

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