Android - Конструктор действий против onCreate

88

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

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

боготворить
источник
2
Как насчет того факта, что Android может уничтожить / воссоздать вашу Activity в любое время? Вы не знаете, будет ли тогда вызван конструктор, и даже если - какой конструктор будет вызываться ... (то же самое относится к фрагментам, и поэтому каждый фрагмент должен реализовывать пустой конструктор по умолчанию).
Marian Paździoch

Ответы:

34

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

Шерил Саймон
источник
73
onCreate () не позволяет использовать поля final.
Gili
2
Но OnCreate не вызывается только один раз, я не прав? Когда я вручную меняю ориентацию экрана и возвращаюсь обратно, каждый раз при перезагрузке активности вызывается oncreate
fercis
2
Я считаю, что @fercis onCreate вызывается только один раз для каждого экземпляра. При повороте устройства этот экземпляр Activity уничтожается и создается новый, вызывающий onCreate. Тем не менее, я почти уверен, что вы не можете создать экземпляры полей final в onCreate, потому что Java не знает, что onCreate будет вызываться только один раз (и действительно, вы можете снова вызвать его в своем коде - плохие вещи будут, но он все равно будет компилироваться), и поэтому единственный способ создать экземпляры полей final - в конструкторе.
Харви Адкок,
Когда именно запускается событие OnCreate? Когда я устанавливаю точку останова в начале события OnCreate, чтобы приложение запускалось и загружало активность на экран, точка останова активируется, и приложение переходит в режим паузы. Мне нужно событие об активности, которое активируется точно перед инициализацией и запуском активности.
Mohammad Afrashteh
@Cheryl Simon, вы сказали, что никогда не создаете активность напрямую, тогда кто создает активность?
Sreekanth Karumanaghat
7

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

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

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

Потому что onCreate()я обычно использую его для отображения отображения на локальные переменные. Хотя android-annotations уже делают это за меня, поэтому у меня редко есть onCreate()метод для моей Activity. Хотя я до сих пор использую его в Сервисе.

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

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

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

  • это константы, которые в любом случае не нужно помещать в конструктор, достаточно статического финала. Сюда входят константы Paint и Path, которые могут быть инициализированы статическим блоком.

Архимед Траяно
источник
1
Что вы имеете в виду, что срок службы объекта будет немного больше? Я каким образом? Так как, например, если вы переместили эти инициализации в onCreate, это все равно займет столько же времени. Я не могу определить никакой разницы в продолжительности жизни. Не могли бы вы подробнее рассказать об этом, так как я чувствую, как относительный новичок, я могу упустить что-то важное здесь.
RichieHH
2
@RichieHH, более длинный, Архимед просто говорит, что конструктор вызывается до onCreate (), и поэтому все, что там делается, будет сохраняться (немного) дольше, чем в противном случае, к моменту уничтожения активности
pho79
6

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

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

biboMandroid
источник
15
Я знаю, что это старый, но в чем преимущество здесь по сравнению с простой реализацией в нем экземпляра суперполя onCreate (). В любом случае вы будете вызывать super.onCreate () из дочернего элемента.
Andrew G
Таким образом, просто передав разные значения одному и тому же KEY в связке или намерении при запуске активности и, таким образом, используя одну и ту же активность, вы можете определить, что показывать в действии в зависимости от полученного значения. Какова конкретная причина, по которой вы обратились к учредителям? Или же оставив неизменяемую часть Activity общей, а для остальной изменяющейся части вы могли бы создать фрагменты.
Nayanesh Gupte
0

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

Pentium10
источник
1
Вы можете подробнее рассказать об этом? То, что вы описываете, звучит интересно, но немного расплывчато. Благодарность!
боготворим
3
Предположим, вам нужно создать собственный класс Activity, который принимает 2 или более параметров. Вам просто нужно использовать Constructor, вы не можете сделать это через onCreate и дополнительные функции. Помогает?
Pentium10
1
Возможно, мне понадобится личный. Предположим, я хочу создать настраиваемый компонент, например настраиваемое средство выбора контактов. Чтобы иметь возможность, startActivityForResultя должен включить частный конструктор в свой пользовательский компонент, даже если это действие никогда не будет запущено и не будет иметь видимых элементов, я просто использую его для результата.
Pentium10
6
Я собираюсь сказать, что для меня @Pentium не имеет смысла, не без примера кода.
Blundell
Я думаю, что одним из преимуществ работы через конструктор является наличие «шаблонного» действия, которое может принимать параметры, которыми может воспользоваться унаследованный класс. Например, если у вас есть два действия, которые отличаются только некоторыми свойствами, например R.id.cameraSurface, R.id.videoSurface, тогда вы можете создать конструктор, который будет принимать параметр, назовите его AbstractResourceActivity, а затем у вас есть CameraActivity, который зарегистрирован в манифесте, который расширяет AbstractResourceActivity, передав идентификатор ресурса.
Archimedes Trajano