Android - Конструктор діяльності проти onCreate


88

Я розумію, що Android Activitiesмає певні життєві цикли, і їх onCreateслід замінити та використовувати для ініціалізації, але що саме відбувається в конструкторі? Чи бувають випадки, коли ви могли б / повинні перевизначити Activityконструктор, або ніколи не торкатися його?

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


2
Як щодо того, що Android може будь-коли знищити / відтворити вашу активність? Ви не знаєте, чи буде викликаний конструктор тоді і навіть якщо - який конструктор буде викликаний ... (те саме стосується Фрагментів, і тому кожен Фрагмент повинен реалізувати порожній конструктор за замовчуванням).
Marian Paździoch

Відповіді:


34

Я не можу придумати жодної вагомої причини робити щось у конструкторі. Ви ніколи не будуєте діяльність безпосередньо, тому ви не можете використовувати її для передачі параметрів. Як правило, просто робіть щось у onCreate.


73
onCreate () заважає вам використовувати кінцеві поля.
Гілі

2
Але OnCreate не викликається лише один раз, я помиляюся? Коли я зміню рукою орієнтацію екрана і назад, кожен раз, коли діяльність перезавантажується, викликається oncreate
fercis

2
@fercis onCreate викликається лише один раз для кожного екземпляра, на мою думку. При обертанні пристрою цей екземпляр Activity руйнується і створюється новий із викликом onCreate. Тим не менш, я майже впевнений, що ви не можете створити екземпляр остаточних полів у onCreate, оскільки Java не знає, що onCreate буде викликатися лише один раз (і справді, ви могли б викликати його знову самостійно у своєму коді - траплятимуться погані речі, але він все одно буде компілюватися), і тому єдиним способом створення екземпляра остаточних полів буде конструктор.
Harvey Adcock

Коли подія OnCreate починає виконуватися саме? Коли я встановлюю точку зупинки на початку події OnCreate, щоб програма запускала і завантажувала активність на екран, тоді точка зупинки активується, і програма переходить на паузу. Мені потрібна подія про діяльність, яка активується саме до ініціалізації та запуску діяльності.
Мохаммад Афраштех,

@ Черіл Саймон, Ви сказали, що ніколи не створюєте діяльність безпосередньо, хто тоді створює діяльність?
Шрікант Карунаганагат

7

Важливою причиною для розміщення речей у конструкторі, як зазначено у коментарі Гілі, є використання кінцевих полів.

Однак, якщо ви ініціалізуєте речі в конструкторі, тоді тривалість життя об'єкта буде трохи довшою, хоча я не думаю, що набагато, оскільки onCreate незабаром після цього буде викликано.

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

Адже onCreate()я зазвичай використовую його для відображення подання до локальних змінних. Хоча андроїд-анотації це вже роблять для мене, тому я рідко маюonCreate() метод для своєї діяльності. Я все ще використовую його в службі.

Однак, якщо ви подивитеся на членів, ви можете ініціалізувати

  • вони мали б метод "закрити", який ви повинні викликати в належний час (onResume або onPause)

  • вони були б частиною подання, що означає, що його потрібно ініціалізувати, а потім викликати onCreate

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


1
Що ви маєте на увазі, що тривалість життя об’єкта буде трохи довшою? Я який шлях? Оскільки, якщо ви перенесли ці ініціалізації в onCreate, наприклад, це все одно займає той самий час. Я не можу визначити різницю в тривалості життя. Чи можете ви розгорнути це ще трохи, будь-ласка, як я відчуваю, як відносний новачок, я міг би пропустити щось важливе тут.
RichieHH

2
@RichieHH довше Архімед просто каже, що конструктор викликається перед onCreate (), і тому все, що там зроблено, буде зберігатися (трохи) довше, ніж інакше, до моменту знищення активності
pho79

6

Зараз я розглядаю справу, яка повинна замінити конструктор. Насправді у мене є деякі види діяльності, які мають однакову структуру. Отже, замість того, щоб створювати багато видів діяльності, я буду створювати одну «Майстерну» діяльність, а інші успадкуватимуть цю. Тому мені потрібно перевизначити конструктор дочірньої діяльності, щоб мати можливість ініціалізувати деякі змінні, які будуть використовуватися в методах oncreate.

У двох словах, конструктор змушує вас імітувати "мастерактивність", яку можна повторно використати у спадок!


15
Я знаю, що це старе, але яка тут перевага від простої реалізації екземпляра суперполя в ньому onCreate (). Ви все одно зателефонуєте супер.onCreate () від дитини.
Andrew G

Отже, просто передавши різні значення в той самий КЛЮЧ у наборі або намірі під час запуску активності і, таким чином, використовуючи ту саму активність, ви можете визначити, що відображати в Activity, залежно від отриманого значення. Яка конкретна причина, за якою ви пішли на співавторів? Або ж збереження незмінної частини Діяльності загальною, а для решти мінливої ​​частини Ви могли б створити Фрагменти.
Наянеш Гупте,

0

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


1
Чи можете ви детальніше це описати? Те, що ви описуєте, звучить цікаво, але трохи розмито. Дякую!
ідолізувати

3
Припустимо, вам потрібно створити власний клас Activity, який приймає 2 або більше параметрів. Вам просто потрібно використовувати конструктор, ви не можете зробити це за допомогою onCreate та додаткових функцій. Це допомагає?
Pentium10,

1
Можливо, мені потрібен приватний. Припустимо, я хочу створити власний компонент, наприклад, спеціальний підбір контактів. Для того, щоб мати, startActivityForResultя повинен включити приватний конструктор у свій користувальницький компонент, навіть якщо ця діяльність ніколи не буде запущена і не має видимих ​​елементів, я просто використовую її для результату.
Pentium10,

6
Я збираюся сказати, що це не має сенсу для мене @Pentium, не без прикладу коду.
Blundell

Я думаю, що однією з переваг виконання речей за допомогою конструктора є активність "шаблону", яка може приймати параметри, якими може скористатися успадкований клас. Наприклад, якщо у вас є дві дії, які відрізняються лише деякими властивостями, наприклад, R.id.cameraSurface, R.id.videoSurface, тоді ви можете створити конструктор, який буде приймати параметр із назвою AbstractResourceActivity, а потім у вас є CameraActivity, яка зареєстрована на маніфесті, який розширює AbstractResourceActivity, передаючи ідентифікатор ресурсу.
Архімед Траяно
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.