java - 按home键时如何防止onPause()?

标签 java android libgdx onpause

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

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

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

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

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

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

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

为什么计时器停止了,而应用程序从未处于暂停状态? 最后,如何在按下主页按钮后保持计时器运行?

谢谢

<小时/>

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

这是策略:

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

代码:

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

ActionResolver 在主 Activity MyGdxGame.java 中调用:

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

backgroundTimer 方法在 AndroidLauncher 中定义:

@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 秒,一旦我返回应用程序,它就会打印:

Seconds remaining : 27

Seconds remaining : 26

Seconds remaining : 25

Seconds remaining : 24

Seconds remaining : 23

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

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

你对这个问题有什么想法吗? 我仍然没有检查alarmmanager,因为我需要在后台运行更复杂的进程,将来,这些服务似乎就是我所需要的。

最佳答案

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

当您按下三个软按钮中的任何一个时调用的另一个方法是onUserLeaveHint,但它不能解决您的问题,顺便说一句您可以在将来使用它:

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

关于java - 按home键时如何防止onPause()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28160639/

相关文章:

java - 如何将 java.util.function.Predicate 实现为 Kotlin lambda?

java - 如何删除 JFrame 中的空白

android:按钮的按下和未按下状态

AlertDialog 中的 Android 选项卡

java - LibGDX "GwtApplication: exception: Couldn' t 加载图像 'a.jpg'

java - Swing 是否持续扫描键盘输入(java)?

java - 通过反射将值设置为java类?

Android 文本在固定高度 TextView 上被截断

java - libGdx - 缩放组不会影响子级

java - 使用 libgdx 的输入文本字段发送特殊字符