Android: выборочное использование onPause()

У меня есть одно приложение таймера активности, в котором я переопределил метод onPause(), чтобы приостановить таймер, когда пользователь нажимает кнопку «Домой» или «Назад». Однако я хотел бы, чтобы таймер продолжал двигаться в случае, если пользователь вручную выключает свой экран, но я знаю, что это также вызовет метод onPause(). Есть ли способ обойти это?


person John Roberts    schedule 02.01.2013    source источник


Ответы (2)


Вы можете переопределить onBackPressed, чтобы добавить дополнительную логику при нажатии кнопки «Назад». Однако лучшим подходом может быть размещение вашего кода в onStop(), который вызывается только тогда, когда другое действие перемещается на передний план.

Дополнительную информацию см. в документах Android.

person Moshe    schedule 02.01.2013
comment
Я не понимаю, как это отвечает на мой вопрос - моя проблема не в кнопке «Назад», а в выключении экрана. - person John Roberts; 02.01.2013
comment
Прошу прощения, я должен был быть более ясным. Вместо того, чтобы переопределять onPause и приостанавливать там свой таймер, переместите логику приостановки таймера в onStop. - person Moshe; 02.01.2013
comment
И onStop, и onPause вызываются, когда экран выключен. - person John Roberts; 02.01.2013
comment
Штопать. Моя ошибка тогда. К сожалению :( - person Moshe; 02.01.2013
comment
Не волнуйтесь. Спасибо за попытку. - person John Roberts; 02.01.2013

В итоге я сделал это, обнаружив и проигнорировав событие выключения экрана внутри метода onPause(). Инструкции о том, как это сделать, можно найти здесь: http://thinkandroid.wordpress.com/2010/01/24/handling-screen-off-and-screen-on-intents/

В частности, я использовал этот код из комментариев (любезно предоставленный Кайлом):

    @Override
    protected void onCreate() {
        // initialize receiver
        IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        BroadcastReceiver mReceiver = new ScreenReceiver();
        registerReceiver(mReceiver, filter);
        //NEW
        PowerManager pm =(PowerManager) getSystemService(Context.POWER_SERVICE);
        // your code
    }
    @Override
    protected void onPause() {
        // when the screen is about to turn off
        // Use the PowerManager to see if the screen is turning off
        if (pm.isScreenOn() == false) {
            // this is the case when onPause() is called by the system due to the screen turning off
            System.out.println(“SCREEN TURNED OFF”);
        } else {
            // this is when onPause() is called when the screen has not turned off
        }
        super.onPause();
    }
person John Roberts    schedule 02.01.2013