2010-07-21 3 views
79

Я понимаю, что Android Activities имеют конкретные жизненные циклы и что onCreate следует переопределить и использовать для инициализации, но что именно происходит в конструкторе? Есть ли случаи, когда вы могли/должны переопределять конструктор Activity, или вы никогда не должны его касаться?Android - Activity Constructor vs onCreate

Я предполагаю, что конструктор никогда не должен использоваться, поскольку ссылки на Activities не полностью очищены (что затрудняет сборщик мусора) и что для этой цели существует onDestroy. Это верно?

+2

Что можно сказать о том, что Android может уничтожить/воссоздать вашу деятельность в любое время? Вы не знаете, будет ли конструктор вызываться тогда и даже если - какой конструктор будет вызываться ... (то же самое относится и к фрагментам, и именно поэтому каждый Фрагмент должен реализовать пустой конструктор по умолчанию). –

ответ

31

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

+65

onCreate() предотвращает использование конечных полей. – Gili

+6

Тестирование? ' закрытый окончательный интерфейсDep dep; public MyActivity() {dep = new DepImpl(); } MyActivity (InterfaceDep dep) {this.dep = dep; } ... @Mock private InterfaceDep dep; @InjectMocks private MyActivity myActivity; ' – saiyancoder

+1

Но OnCreate не вызывается только один раз, я ошибаюсь? Когда я меняю ориентацию экрана и обратно рукой, каждый раз, когда перезагрузка активности, oncreate вызывается – fercis

1

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

+1

Можете ли вы подробнее остановиться на этом? То, что вы описываете, звучит интересно, но оно немного расплывчато. Благодаря! – idolize

+3

Предположим, вам нужно создать настраиваемый класс Activity, который принимает 2 или более параметров. Вам просто нужно использовать конструктор, вы не можете этого сделать с помощью onCreate и дополнительных функций. Помогает ли это? – Pentium10

+4

Но вы явно не создаете Деятельности, вы создаете Intent ... – idolize

7

Я сейчас на случай, который должен переопределить конструктор. Фактически, у меня есть некоторые виды деятельности, которые имеют одинаковую структуру. Поэтому вместо создания многих действий я создам одно действие «Мастер», а остальные наследуют это. Поэтому мне нужно переопределить конструктор дочерней активности, чтобы иметь возможность инициализировать некоторые переменные, которые будут использоваться в методах oncreate.

В двух словах конструктор заставляет вас моделировать «мастер-активность», которую можно использовать повторно наследованием!

+14

Я знаю, что это старо, но в чем польза от этого только за внедрение экземпляра суперполя в нем onCreate(). Вы все равно будете называть super.onCreate() от ребенка. –

+0

Таким образом, просто передавая разные значения одному и тому же KEY в связке или намерении во время запуска активности и, таким образом, используя ту же активность, вы можете определить, что показывать в действии в зависимости от полученного значения. Какова конкретная причина, по которой вы пошли на подрядчиков? Или, оставив неизменяемую часть активности обычной и для остальной части меняющейся части вы могли бы создать Фрагменты. –

+0

который один зовет первым. конструктор или oncreate. Я думаю, что конструктор – Nepster

6

Хорошая причина для помещения вещей в конструктор, как заявил комментарий Гили, - это использование конечных полей.

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

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

Для onCreate() Обычно я использую его для отображения отображения локальных переменных. Хотя андроидные аннотации уже делают это для меня, поэтому у меня редко есть метод onCreate() для моей активности. Я все еще использую его в Сервисе.

Однако, если посмотреть на членах может быть инициализация

  • они будут иметь метод «близко», что вы должны вызвать в нужное время (onResume или OnPause)

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

  • Это константы, которые в любом случае не нужно вставлять в конструктор, только статический конечный результат. Это включает в себя константы Paint и Path, которые могут быть инициализированы статическим блоком

+0

Что значит продолжительность жизни объекта будет немного дольше? Я как? Так как если вы переместили эти initalisations в onCreate, например, это все равно занимает одно и то же время. Нет никакой разницы в продолжительности жизни, которую я могу определить. Можете ли вы рассказать об этом немного больше, как мне кажется, как относительного новичка, я, возможно, не могу найти что-то важное здесь. – RichieHH

+2

@RichieHH более длинным Архимедом просто говорит, что конструктор вызывается до onCreate(), и поэтому все, что будет сделано, будет сохраняться (немного) дольше, чем в противном случае к моменту уничтожения активности. – pho79

+0

Спасибо, я не заметил комментариев от в прошлом году. Ваш ответ правильный. –

Смежные вопросы