2015-01-26 2 views
0

Я работаю над приложением 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-е сообщение, когда ожидается (когда игра идет в приостановленной)
  • Отсчет, кажется, работает в фоновом режиме
  • Результат обратный отсчет печатает только при возобновлении

У вас есть идеи по этой проблеме? Я все еще не проверял будильника, так как мне нужно будет более сложный процесс, работающий в фоновом режиме, в будущем услуги, похоже, мне нужны.

+0

, потому что вызов 'onResume' не заставит ваше приложение, чтобы остаться. Если ваша деятельность находится в фоновом режиме, она приостановлена. Вам нужно сохранить состояние вашего таймера в 'onPause' вместе со временем, чтобы вы могли восстановить его правильно, когда пользователь вернется в приложение. – njzk2

+0

Если вам нужен таймер, который будет запущен, а также когда ваша активность не активна, вам нужен либо диспетчер будильника, либо служба. – njzk2

+0

Для любых задач, связанных с временем, вы должны использовать 'AlarmManager' – tachyonflux

ответ

3

Вы должны использовать службу для решения этой проблемы: Services

Другой метод, который вызывается при нажатии некоторых из трех мягкой кнопки является onUserLeaveHint, но она не может решить вашу проблему, кстати, вы можете использовать его в будущем уверен:

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

Спасибо за ваш ответ! Услуги, похоже, мне нужны, но у меня странное поведение моего сервиса. Я обновил свой первоначальный вопрос с помощью нового кода. Если у вас есть идея немного чего-то, чего не хватает в моем коде для правильной работы, было бы здорово! Благодаря ! – vdlmrc

1

OK! Итак, после того, как я разозлился весь день с этой проблемой, я наконец нашел (очень простое) решение:

В редакции моего первоначального вопроса я начал работать с Сервисами, но у меня было очень странное поведение службы. Моя проблема возникла из-за того, что в моем классе IntentService я использовал метод Timer() и Task() из пакета libgdx.

Я просто заменил эти два класса эквивалентными методами Timer() и TimerTask() из пакета java.util, и 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);   
} 
} 
Смежные вопросы