Я работаю над приложением libGDX, которое включает в себя таймер. Мне нужно, чтобы таймер работал, даже если нажата кнопка дома, и даже если экран выключен, нажав кнопку включения.Как предотвратить onPause() при нажатии кнопки «домой»?
Для этого я подумал о том, чтобы приложение не было в состоянии паузы. В 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 на неактивном InputConnection
01-26 18: 17: 28.899: I/AndroidIn положить (2753): датчик
01-26 18: 17: 28.919: I/AndroidGraphics (2753): возобновился
Как вы можете видеть, когда приложение работает, если нажать на кнопку домой , приложение возобновляет работу, не останавливаясь в состоянии паузы, и когда я вернусь в приложение, он снова возобновится. Но таймер остановлен ...
Почему таймер остановился, когда приложение никогда не было в состоянии паузы? И, наконец, как я могу запустить таймер после нажатия кнопки «домой»?
Благодаря
Edit: Так что я начал пользоваться услугами, и я до сих пор сталкиваются с проблемами, чтобы иметь таймер работает в фоновом режиме.
Вот startegy:
- В моей 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 вызывается в основной деятельности 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 секунд, как только я вернусь в приложение будет печатать:
Секунды Осталось: 27
Секунды Осталось: 26
секунд остальные: 25
секунды осталось: 24
секунды осталось: 23
Так что у меня это странное поведение службы:
- печати 1-е сообщение, когда ожидается (когда игра идет в приостановленной)
- Отсчет, кажется, работает в фоновом режиме
- Результат обратный отсчет печатает только при возобновлении
У вас есть идеи по этой проблеме? Я все еще не проверял будильника, так как мне нужно будет более сложный процесс, работающий в фоновом режиме, в будущем услуги, похоже, мне нужны.
, потому что вызов 'onResume' не заставит ваше приложение, чтобы остаться. Если ваша деятельность находится в фоновом режиме, она приостановлена. Вам нужно сохранить состояние вашего таймера в 'onPause' вместе со временем, чтобы вы могли восстановить его правильно, когда пользователь вернется в приложение. – njzk2
Если вам нужен таймер, который будет запущен, а также когда ваша активность не активна, вам нужен либо диспетчер будильника, либо служба. – njzk2
Для любых задач, связанных с временем, вы должны использовать 'AlarmManager' – tachyonflux