Android - ตัวสร้างกิจกรรมเทียบกับ onCreate


89

ฉันเข้าใจว่า Android Activitiesมีวงจรชีวิตที่เฉพาะเจาะจงและonCreateควรถูกลบล้างและใช้สำหรับการเริ่มต้น แต่จะเกิดอะไรขึ้นในตัวสร้าง? มีกรณีใดบ้างที่คุณสามารถ / ควรแทนที่ตัวActivityสร้างด้วยหรือคุณไม่ควรแตะต้องมัน?

ฉันสมมติว่าไม่ควรใช้ตัวสร้างเนื่องจากการอ้างอิงถึงActivitiesไม่ได้รับการทำความสะอาดทั้งหมด (จึงขัดขวางตัวเก็บขยะ) และนั่นonDestroyก็เพื่อจุดประสงค์ ถูกต้องหรือไม่


2
แล้วความจริงที่ว่า Android สามารถทำลาย / สร้างกิจกรรมของคุณใหม่ได้ตลอดเวลาล่ะ? คุณไม่รู้ว่าจะเรียกตัวสร้างหรือไม่และแม้ว่า - จะเรียกตัวสร้างใด ... (เช่นเดียวกันกับ Fragments และนี่คือสาเหตุที่ Fragment ทุกชิ้นต้องใช้ตัวสร้างเริ่มต้นที่ว่างเปล่า)
Marian Paździoch

คำตอบ:


34

ฉันไม่สามารถคิดเหตุผลที่ดีที่จะทำอะไรในตัวสร้างได้ คุณไม่เคยสร้างกิจกรรมโดยตรงดังนั้นคุณจึงไม่สามารถใช้เพื่อส่งผ่านพารามิเตอร์ได้ โดยทั่วไปเพียงแค่ทำสิ่งต่างๆใน onCreate


75
onCreate () ป้องกันไม่ให้คุณใช้ฟิลด์สุดท้าย
Gili

2
แต่ OnCreate ไม่ได้เรียกแค่ครั้งเดียวฉันคิดผิดหรือเปล่า? เมื่อฉันเปลี่ยนการวางแนวหน้าจอและย้อนกลับด้วยมือทุกครั้งที่มีการโหลดกิจกรรมใหม่จะเรียกว่า
oncreate

2
@fercis onCreate ถูกเรียกเพียงครั้งเดียวต่ออินสแตนซ์ที่ฉันเชื่อ เมื่อหมุนอุปกรณ์อินสแตนซ์ของกิจกรรมนั้นจะถูกทำลายและสร้างขึ้นใหม่โดยเรียกใช้ onCreate ที่กล่าวว่าฉันค่อนข้างมั่นใจว่าคุณไม่สามารถสร้างอินสแตนซ์ฟิลด์สุดท้ายใน onCreate ได้เพราะ Java ไม่รู้ว่า onCreate จะถูกเรียกเพียงครั้งเดียว (และแน่นอนคุณสามารถเรียกมันอีกครั้งในรหัสของคุณ - สิ่งเลวร้ายจะเกิดขึ้น แต่มันจะยังคงคอมไพล์) ดังนั้นวิธีเดียวในการสร้างอินสแตนซ์ฟิลด์สุดท้ายจะอยู่ในตัวสร้าง
Harvey Adcock

เหตุการณ์ OnCreate จะเริ่มทำงานเมื่อใด เมื่อฉันตั้งเบรกพอยต์ที่จุดเริ่มต้นของเหตุการณ์ OnCreate เพื่อให้แอปทำงานและโหลดกิจกรรมไปที่หน้าจอจากนั้นเบรกพอยต์จะเปิดใช้งานและแอปจะหยุดชั่วคราว ฉันต้องการกิจกรรมเกี่ยวกับกิจกรรมที่เปิดใช้งานก่อนที่กิจกรรมจะเริ่มต้นและเปิดตัว
Mohammad Afrashteh

@ เชอริลไซมอนคุณบอกว่าคุณไม่เคยสร้างกิจกรรมโดยตรงแล้วใครเป็นคนสร้างกิจกรรม?
Sreekanth Karumanaghat

7

เหตุผลที่ดีในการใส่สิ่งต่างๆลงในตัวสร้างตามความคิดเห็นของ Gili คือการใช้ฟิลด์สุดท้าย

อย่างไรก็ตามหากคุณเริ่มต้นสิ่งต่างๆในตัวสร้างอายุการใช้งานของวัตถุจะนานขึ้นเล็กน้อยแม้ว่าฉันจะไม่คิดมากเพราะonCreateจะถูกเรียกหลังจากนั้นไม่นาน

แม้ว่ามันจะขัดกับอุดมคติของฉัน แต่ฉันก็หลีกเลี่ยงตัวสร้างสำหรับการเริ่มต้นสมาชิกกิจกรรมและพึ่งพาonResume()และonPause()ทรัพยากรที่แอปของฉันจัดการ

สำหรับonCreate()ฉันมักจะใช้เพื่อดูการแมปกับตัวแปรภายใน แม้ว่าคำอธิบายประกอบของ Android จะทำสิ่งนั้นให้ฉันแล้วดังนั้นฉันจึงไม่ค่อยมีonCreate()วิธีสำหรับกิจกรรมของฉัน ฉันยังคงใช้มันในบริการอยู่

อย่างไรก็ตามหากคุณดูสมาชิกคุณอาจกำลังเริ่มต้น

  • พวกเขาจะมีเมธอด "ปิด" ที่คุณต้องเรียกใช้ในเวลาที่เหมาะสม (onResume หรือ onPause)

  • พวกเขาจะเป็นส่วนหนึ่งของมุมมองซึ่งหมายความว่าจะต้องมีการเตรียมใช้งานจากนั้นจึงต้องเรียกใช้ onCreate

  • พวกมันเป็นค่าคงที่ซึ่งไม่จำเป็นต้องใส่ในคอนสตรัคเตอร์อยู่แล้วเพียงแค่สแตติกสุดท้ายก็ทำได้ ซึ่งรวมถึงค่าคงที่ของสีและเส้นทางซึ่งสามารถเริ่มต้นได้โดยบล็อกแบบคงที่


1
คุณหมายถึงอะไรอายุการใช้งานของวัตถุจะนานขึ้นเล็กน้อย? ฉันมีวิธีอะไร? เนื่องจากถ้าคุณย้ายการเริ่มต้นเหล่านี้ไปยัง onCreate เช่นนั้นก็ยังคงใช้เวลาเท่าเดิม อายุการใช้งานไม่แตกต่างกันที่ฉันสามารถระบุได้ คุณช่วยขยายความเรื่องนี้ให้มากขึ้นหน่อยได้ไหมในฐานะผู้มาใหม่ฉันอาจจะพลาดอะไรบางอย่างที่สำคัญที่นี่
RichieHH

2
@RichieHH โดยอาร์คิมิดีสอีกต่อไปกำลังบอกว่าคอนสตรัคเตอร์ถูกเรียกก่อน onCreate () ดังนั้นสิ่งที่ทำจะคงอยู่ (เล็กน้อย) นานกว่าที่อื่นเมื่อกิจกรรมถูกทำลาย
pho79

6

ตอนนี้ฉันอยู่ในเคสที่ต้องการแทนที่ตัวสร้าง อันที่จริงฉันมีกิจกรรมบางอย่างที่มีโครงสร้างเหมือนกัน ดังนั้นแทนที่จะสร้างกิจกรรมมากมายฉันจะสร้างกิจกรรม "ต้นแบบ" หนึ่งกิจกรรมและกิจกรรมอื่น ๆ จะสืบทอดกิจกรรมนี้ ดังนั้นฉันจำเป็นต้องแทนที่ตัวสร้างของกิจกรรมลูกเพื่อให้สามารถเริ่มต้นตัวแปรบางตัวที่จะใช้ในวิธีการสร้างได้

ในสองคำตัวสร้างทำให้คุณจำลอง "masteractivity" ที่สามารถนำมาใช้ซ้ำได้โดยการสืบทอด!


15
ฉันรู้ว่านี่เป็นเรื่องเก่า แต่มีประโยชน์อะไรที่นี่มากกว่าแค่ใช้การสร้างอินสแตนซ์ฟิลด์ซูเปอร์ฟิลด์ใน onCreate () คุณจะเรียก super.onCreate () จากเด็ก
Andrew G

ดังนั้นเพียงแค่ส่งค่าที่แตกต่างกันไปยัง KEY เดียวกันในบันเดิลหรือความตั้งใจในขณะที่เปิดตัวกิจกรรมและด้วยการใช้กิจกรรมเดียวกันคุณก็สามารถกำหนดสิ่งที่จะแสดงในกิจกรรมได้โดยขึ้นอยู่กับมูลค่าที่ได้รับ อะไรคือเหตุผลเฉพาะที่คุณเลือกสำหรับผู้มีส่วนร่วม? หรืออื่น ๆ ที่ทำให้ส่วนที่ไม่เปลี่ยนแปลงของกิจกรรมเป็นเรื่องธรรมดาและส่วนที่เหลือของการเปลี่ยนแปลงคุณสามารถสร้าง Fragments ได้
Nayanesh Gupte

0

คุณต้องแทนที่ Constructor เมื่อกิจกรรมของคุณจะมีพารามิเตอร์ที่กำหนดเองหรือคุณต้องการติดตามการโทรจากคลาสที่สืบทอดมา


1
คุณสามารถอธิบายเพิ่มเติมเกี่ยวกับเรื่องนี้ได้หรือไม่? สิ่งที่คุณอธิบายฟังดูน่าสนใจ แต่ก็คลุมเครือเล็กน้อย ขอบคุณ!
บูชา

3
สมมติว่าคุณต้องสร้างคลาสกิจกรรมแบบกำหนดเองที่ใช้ 2 พารามิเตอร์ขึ้นไป คุณต้องใช้ Constructor คุณไม่สามารถทำได้ผ่าน onCreate และส่วนเสริม มันช่วย?
Pentium10

1
ฉันอาจต้องการแบบส่วนตัว สมมติว่าฉันต้องการสร้างส่วนประกอบที่กำหนดเองเช่นเครื่องมือเลือกผู้ติดต่อที่กำหนดเอง ในการที่จะให้startActivityForResultฉันต้องใส่คอนสตรัคเตอร์ส่วนตัวในคอมโพเนนต์ที่กำหนดเองของฉันแม้ว่ากิจกรรมนั้นจะไม่ถูกเปิดใช้งานและไม่มีองค์ประกอบที่สามารถมองเห็นได้ฉันก็แค่ใช้สิ่งที่เป็นผลของมัน
Pentium10

6
ฉันจะบอกว่ามันไม่สมเหตุสมผลสำหรับฉัน @Pentium ไม่ใช่ถ้าไม่มีตัวอย่างโค้ด
Blundell

ฉันคิดว่าข้อดีอย่างหนึ่งของการทำสิ่งต่างๆผ่านตัวสร้างคือการมีกิจกรรม "เทมเพลต" ซึ่งสามารถใช้พารามิเตอร์ที่คลาสที่สืบทอดมาสามารถใช้ประโยชน์ได้ ตัวอย่างเช่นหากคุณมีสองกิจกรรมที่แตกต่างกันในคุณสมบัติบางอย่างเช่น R.id.cameraSurface, R.id.videoSurface คุณสามารถสร้างตัวสร้างที่จะรับพารามิเตอร์ที่เรียกว่า AbstractResourceActivity จากนั้นคุณมี CameraActivity ที่ลงทะเบียนไว้ บนรายการที่ขยาย AbstractResourceActivity ที่ส่งผ่านใน ID ทรัพยากร
Archimedes Trajano
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.