按下主页按钮时如何防止 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 中,我有一个计时器,我可以在其中输入一些
秒,
- 那我用任务倒计时到0.
- 当我在做一个 libGDX 项目时,我使用一个界面来
将当前秒数传达给 AndroidLauncher,
当游戏进入暂停状态时。
- 该界面还触发了一个保持倒计时的服务
运行 相同的计时器和任务,它每秒钟在控制台中打印当前秒数。
代码:
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);
}
}
我正在开发一个包含计时器的 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 中,我有一个计时器,我可以在其中输入一些 秒,
- 那我用任务倒计时到0.
- 当我在做一个 libGDX 项目时,我使用一个界面来 将当前秒数传达给 AndroidLauncher, 当游戏进入暂停状态时。
- 该界面还触发了一个保持倒计时的服务 运行 相同的计时器和任务,它每秒钟在控制台中打印当前秒数。
代码:
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);
}
}