Android: переопределение onPause и onResume - правильный путь - программирование
Подтвердить что ты не робот

Android: переопределение onPause и onResume - правильный путь

При переопределении методов onPause() и onResume() активности, где правильное местоположение вызывает super.onPause() и super.onResume()? В начале метода или в конце?

4b9b3361

Ответ 1

Из http://developer.android.com/guide/components/activities.html#ImplementingLifecycleCallbacks:

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

Итак, для обратных вызовов жизненного цикла, таких как onPause() и onResume(), мы должны сделать super.onPause() или super.onResume() в самом начале. Для других методов все зависит от семантики суперкласса.

Ответ 2

Обновление: Это принятый ответ, и он содержит хорошее количество хорошей информации, включая полезную диаграмму, собранную в одном месте. Однако, по-видимому, это неверно, по крайней мере, согласно текущей документации Android, которая, как указывает плакат, является основным источником информации о SDK. Возможно, документация была уточнена после того, как этот ответ был опубликован. Но, в любом случае, не прекращайте чтение с этим ответом, посмотрите ответ espinchi ниже. Он имеет документацию на своей стороне.


Размещение методов super зависит только от ваших предпочтений. Было бы важно, только если эти методы применяли параметры ИЛИ, если вы выполняли параллельную работу. Например, если вы это сделаете:

    @Override
    protected void onPause() {
        try {
            someOtherThread.join();
        } catch (InterruptedException e) {
            LOG.e(e);
        }
        super.onPause();
    }

он может заблокировать поток и предотвратить вызов super.

Я предлагаю вам прочитать всю доступную документацию, потому что они вам очень помогут. Например, это то, что вы можете найти в onPause javadoc. Я выделил важные части:

Вызывается как часть жизненного цикла деятельности, когда происходит деятельность в фоновом режиме, но пока еще не убит. Аналоги onResume().

Когда действие B запускается перед активностью A, этот обратный вызов будет вызывается на A. B не будет создан до тех пор, пока не будет возвращен A onPause(), поэтому не делайте здесь ничего лишнего.

Этот обратный вызов в основном используется для сохранения любого постоянного состояния активность редактируется, чтобы представить пользователю "редактирование на месте" и убедиться, что ничего не потеряно, если ресурсов недостаточно для начать новую деятельность без первого убийства этого. Это также хорошее место, чтобы делать что-то вроде остановки анимации и других вещей, которые потребляют значительное количество CPU, чтобы переключиться на как можно быстрее, или закрыть ресурсы, которые эксклюзивный доступ, такой как камера.

В ситуациях, когда системе требуется больше памяти, она может убить приостановленную процессы для восстановления ресурсов. Из-за этого вы должны быть уверены что все ваше состояние будет сохранено к моменту вашего возвращения из этого Функция. В общем случае onSaveInstanceState (Bundle) используется для сохранения per-instance в активности, и этот метод используется для хранения глобальные постоянные данные (в контент-провайдерах, файлы и т.д.)

После получения этого вызова вы обычно получаете следующий вызов: onStop() (после того, как следующее действие было возобновлено и отображено), однако в некоторых случаях будет прямой вызов back on onResume() не пройдя остановленное состояние.

Производные классы должны обращаться к реализации суперкласса этого метода. Если они этого не сделают, будет выбрано исключение.

Я рекомендую эту блок-схему для вас, это поможет вашему развитию чрезвычайно:

Android Activity Flowchart

Ответ 3

Это, вероятно, не имеет значения, но, чтобы точно знать, вам нужно знать, что делают супер-методы, и обычно эта информация недоступна для вас.

Мой стиль для вызова, например. super.onCreate(), super.onResume() и т.д. перед телом моего собственного метода и, например, super.onPause() и super.onDestroy() после тела моего собственного метода.

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

Ответ 4

Нет никакого правильного или неправильного. Это зависит от того, что вы делаете при реализации этих методов. Иногда вам нужно, чтобы super находился перед вашим кодом, а потом.

Ответ 5

Вы можете поместить его в любом месте. Сначала вы должны понимать жизненный цикл Деятельности. Проверьте следующую ссылку Здесь

Загрузите демоверсию и запустите ее, вы будете понятны

Ответ 6

Включение в код Android, вы можете обнаружить, что фреймворк устанавливает флаг, называемый mcalled, когда вы вызываете super.onPause(). Этот флаг позже проверяется на возобновление с помощью фреймворка.

if (!mCalled) {
            throw new SuperNotCalledException(
                "Activity " + mComponent.toShortString() +
                " did not call through to super.onResume()");
        }

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