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

How to prevent onPause() when pressing home button?

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

为此,我考虑过阻止应用程序进入暂停状态。 在 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

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

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

谢谢


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

这是策略:

代码:

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

主要调用ActionResolver activity MyGdxGame.java :

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

在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我还是没去查,因为我需要在后台有更精细的进程运行ning,以后好像就是我需要的服务了

你应该使用服务来解决这个问题:Services

另外一个当你按下三个软键中的某个时调用的方法是onUserLeaveHint,但它不能解决你的问题,顺便说一下,你以后肯定会用到它:

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

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

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

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

现在,我的 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);        
}
}