Должен ли вызов метода суперкласса быть первым оператором?

Результаты распознавания речи можно прочитать в методе onActivityResult(int requestCode, int resultCode, Intent data), как показано в этот пример. Этот метод переопределяет тот же метод в классе Activity: почему вызов метода суперкласса не является первым оператором?

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == VOICE_RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK) {
        // Fill the list view with the strings the recognizer thought it could have heard
        // ...
    }

    super.onActivityResult(requestCode, resultCode, data);
}

person enzom83    schedule 08.03.2012    source источник


Ответы (2)


Методы, которые вы переопределяете и которые являются частью создания компонента (onCreate(), onStart(), onResume() и т. д.), вы должны связать с суперклассом в качестве первого оператора, чтобы гарантировать, что у Android есть шанс выполнить свою работу, прежде чем вы попытаетесь сделать что-то, что зависит по факту выполнения этой работы.

Методы, которые вы переопределяете и которые являются частью уничтожения компонентов (onPause(), onStop(), onDestroy() и т. д.), вы должны сначала выполнить свою работу, а затем связать их с суперклассом. Таким образом, если Android очистит что-то, от чего зависит ваша работа, вы сначала сделаете свою работу.

Методы, которые возвращают что-то отличное от void (onCreateOptionsMenu() и т. д.), иногда вы связываете с суперклассом в операторе return, предполагая, что вы специально не делаете что-то, что должно принудительно возвращать определенное значение.

Все остальное, например onActivityResult(), в целом зависит от вас. Я склонен привязываться к суперклассу в первую очередь, но если вы не сталкиваетесь с проблемами, позднее присоединение к цепочке должно быть в порядке.

person CommonsWare    schedule 08.03.2012
comment
Но почему официальный документ говорит: всегда сначала вызывайте метод суперкласса в onPause()? developer.android.com/training/basics/activity-lifecycle/ - person petrnohejl; 16.08.2012
comment
Это важный ответ. Хотелось бы, чтобы это было в официальных документах. - person likejudo; 17.05.2014
comment
Не обязательно правда. Цитата: Крайне важно вызывать AndroidInjection.inject() перед super.onCreate() в Activity, поскольку вызов super прикрепляет Fragments из предыдущего экземпляра действия во время изменения конфигурации, что, в свою очередь, вводит Fragments. Чтобы Fragment инъекция прошла успешно, Activity уже должна быть введена. То же самое касается обычной инъекции кинжала. - person arekolek; 17.05.2018
comment
@arekolek: В 2012 году, когда был написан этот ответ, ничего этого не существовало. Теперь, в 2018 году, я согласен с тем, что некоторые конкретные библиотеки или другие вещи могут потребовать от вас принятия мер до вызова super.onCreate(). В общем (то есть, если вы не используете такие библиотеки), я поддерживаю этот ответ. - person CommonsWare; 17.05.2018
comment
Также есть комментарий call the superclass method first в onStop() в документах. - person Fredrick Gauss; 31.05.2018

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

В целом, хотя это не имеет значения, и если это произойдет, это будет упомянуто в SDK - я столкнулся с упоминанием нескольких мест в SKD (я думаю, в документации, касающейся диалогов), но я не могу точно вспомнить, какие страница/раздел, на котором он находится.

Более подробное обсуждение этой темы можно найти здесь: http://groups.google.com/group/android-developers/browse_thread/thread/9ddb2b06c21c8457

person dcow    schedule 08.03.2012