Внедрение Android-методов жизненного цикла может вызвать реализацию суперкласса после выполнения какой-либо работы?

В Документация для Android у нас есть:

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

Но я видел случаи, когда код помещается после метода суперкласса, особенно для таких методов, как onPause(), onStop(), onDestroy(), например:

@Override
protected void onPause() {
    LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
    super.onPause();
} 

http://www.vogella.com/articles/AndroidBroadcastReceiver/article.html#ownreceiver_localbroadcastmanager

В обоих случаях это работает. Итак, какая разница между помещением кода до o после вызова метода суперкласса? Каков правильный путь?

Ответ 1

Непосредственно скопирован из CommonsWare этот ответ. Так лучше дайте ему верхнюю часть

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

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

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

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

Но если нет зависимости, тогда вызовите методы суперкласса в любом месте.

Ответ 2

Когда мне было интересно об этой проблеме, я нашел это правило:

during any kind of initialization, let the super class do their work first; 
during any kind of finalization, you do your work first

Это логично)

Ответ 3

Согласно стандартам Java и лучшим практикам, вызов super должен идти первым. Я считаю, что причина этого в том, что может быть работа, которая должна быть выполнена в super, которая может вызвать проблемы в вашем коде, если вы не сделали это первым.

Однако я проделал работу перед вызовом super и не имел никаких проблем.

У меня нет никаких примеров фреймворка, но у меня есть класс BaseActivity, который extends Activity и все мои Activities расширяют BaseActivity. У меня есть несколько методов, которые необходимо реализовать в этих подклассах. Если я сначала не сделаю вызов super, тогда некоторые переменные не будут инициализированы, поэтому я должен получить NPE s

Ответ 4

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

public void onCreate() {
   super.onCreate();
   // do work after super class function
   // setContentView(R.layout.main);
    }

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

public void onPause() {
   // do work here first before super class function //LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
       super.onPause();
    }