Внедрение 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();
}