Уведомление Android pre onPause

Я переношу существующую игру с iOS на Android, используя cocos2dx. Когда приложение ставится на паузу, например, при нажатии кнопки «заблокировать» на устройстве, приложение приостанавливается/переходит в спящий режим, как и должно быть. Но когда устройство повторно активируется, и мое приложение снова появляется, оно зависает на пару секунд. Что я хотел бы сделать, так это показать модальное сообщение в игре, сообщающее пользователю, что он / она должен подождать секунду, пока игра не вернется из режима замораживания. Но я просто могу сделать эту работу.

Я пытался показать сообщение в «onPause» и «onResume», но сообщение не отображается до тех пор, пока режим замораживания не закончится, и я хотел бы, чтобы оно отображалось в момент повторного появления приложения.

Как я могу заставить это работать?

на iOS можно получить уведомление до того, как приложение перейдет в фоновый режим. «applicationWillResignActive», и я не могу найти ничего подобного на Android. Существует ли на Android какая-либо функция уведомления/делегата, такая как «pre-onPause»?

Любые идеи приветствуются.

Лучший


person tomas    schedule 28.11.2012    source источник
comment
В чем проблема с отображением диалога в onPause() перед вызовом super.onPause()?   -  person Simon    schedule 29.11.2012
comment
что ты имеешь в виду под заморозкой? Вы не выполняете повторную инициализацию в onResume?   -  person marcinj    schedule 29.11.2012


Ответы (2)


Вы можете создать BroadcastReceiver, который прослушивает намерение SSCREEN_OFF и показывает ваш диалог, когда это происходит, таким образом, он все еще будет присутствовать, когда экран снова включится.

public class ScreenReceiver extends BroadcastReceiver {
    /**
     * @see android.content.BroadcastReceiver#onReceive(Context,Intent)
     */
    @Override
    public void onReceive(final Context context, Intent intent) {

        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
            //Put your Dialog showing code here
        }
    }
}

Затем внутри вашей деятельности вы можете создать экземпляр и зарегистрировать свой приемник следующим образом:

IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
BroadcastReceiver mReceiver = new ScreenReceiver();
registerReceiver(mReceiver, filter);
person FoamyGuy    schedule 28.11.2012
comment
Спасибо. Это не запускается/вызывается до тех пор, пока не будет onPause, и мне нужно что-то, что вызывается непосредственно перед вызовом onPause. - person tomas; 29.11.2012

В проекте cocos2d-x внутри класса AppDelegate есть функция applicationDidEnterBackground(), где останавливается анимация, вот что такое замораживание, а затем AppDelegate::applicationWillEnterForeground() — это функция, в которой анимация начинается снова, что требует времени, когда ваше приложение снова появляется

поэтому поместите диалоговое окно или скажите «Пауза экрана» в applicationDidEnterBackground(), а затем сделайте так, как хотите.

Может быть и другой способ, который я использую, но для этого нужны вызовы JNI. Что я сделал, так это сделал вызовы JNI с android на cocos2d-x.. Поскольку мне нужно было все: BroadcastReceiver, Battery Indicator и т. д.

ТАК всякий раз, когда это происходит, я вызываю вызов JNI из моего метода onPause, который затем выдает pauseScene в cocos2d-x.

person user1169079    schedule 29.11.2012
comment
Спасибо. Когда я сообщаю окно сообщения для отображения, когда applicationDidEnterBackground() - или когда onPause, оно все еще не отображается, пока приложение не вернется из режима замораживания. Я предполагаю, что ccdirector не обновляется/отрисовывается, пока не вернется из Freeze (после onResume). - person tomas; 29.11.2012
comment
@tomas: я думаю, это должно работать ... да, если его тяжелый процесс ccdirector требует времени для обновления ... после выхода из резюме ... но вы вызываете свое окно сообщения в DidEnterBackground ... позаботьтесь о том, чтобы вы вызывали его перед stopAnimation () ..... так что, как только он перейдет в фоновый режим и пока ccdirector не остановит всю визуализацию и анимацию, вы получите это окно сообщения, и после выхода с переднего плана вы можете возобновить то же самое - person user1169079; 29.11.2012