super.onCreate (saveInstanceState);


89

ผมได้สร้างโครงการและการประยุกต์ใช้ Android ใน MainActivity.java> มันเป็นโทรonCreate()super.onCreate(savedInstanceState)

ในฐานะผู้เริ่มต้นใครสามารถอธิบายได้ว่าจุดประสงค์ของบรรทัดข้างต้นคืออะไร?

คำตอบ:


161

ทุกกิจกรรมที่คุณทำจะเริ่มต้นด้วยลำดับวิธีการเรียกใช้ onCreate()เป็นการโทรครั้งแรก

หนึ่งในกิจกรรมของแต่ละคนและทุกขยายandroid.app.Activityไม่ว่าโดยตรงหรือโดย subclassing subclass Activityของผู้อื่น

ใน Java เมื่อคุณสืบทอดจากคลาสคุณสามารถแทนที่เมธอดเพื่อรันโค้ดของคุณเองได้ ร่วมเป็นตัวอย่างที่ดีของนี้เป็นเอาชนะของวิธีการเมื่อขยายtoString()java.lang.Object

เมื่อเราแทนที่เมธอดเรามีตัวเลือกในการแทนที่เมธอดในคลาสของเราอย่างสมบูรณ์หรือขยายเมธอดคลาสแม่ที่มีอยู่ การโทรsuper.onCreate(savedInstanceState);จะเป็นการบอกให้ Dalvik VM รันโค้ดของคุณนอกเหนือจากโค้ดที่มีอยู่ใน onCreate () ของคลาสพาเรนต์ หากคุณเว้นบรรทัดนี้แสดงว่าโค้ดของคุณเท่านั้นที่รัน รหัสที่มีอยู่จะถูกละเว้นโดยสิ้นเชิง

อย่างไรก็ตามคุณต้องรวมการโทรขั้นสูงนี้ไว้ในวิธีการของคุณเพราะถ้าคุณไม่ทำเช่นนั้นonCreate()โค้ดในActivityจะไม่ทำงานและแอปของคุณจะประสบปัญหาทุกประเภทเช่นไม่มีบริบทที่กำหนดให้กับกิจกรรม (แม้ว่าคุณจะโดนSuperNotCalledExceptionก่อนที่คุณจะมีโอกาสที่จะคิดออกว่าคุณมีบริบทไม่มีบริการ)

ในระยะสั้นคลาสของ Android อาจซับซ้อนอย่างไม่น่าเชื่อ โค้ดในคลาสเฟรมเวิร์กจะจัดการกับสิ่งต่างๆเช่นการวาด UI การทำความสะอาดบ้านและการดูแลรักษากิจกรรมและวงจรชีวิตของแอปพลิเคชัน superการโทรช่วยให้นักพัฒนาสามารถเรียกใช้โค้ดที่ซับซ้อนนี้เบื้องหลังได้ในขณะที่ยังคงให้ความเป็นนามธรรมที่ดีสำหรับแอปของเราเอง


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

15
หากคุณโทรหา super รหัสของวิธีการหลักจะถูกใส่ไว้ในตำแหน่งที่ super call อยู่ ถ้าซุปเปอร์ไม่เรียกว่าเป็นวิธีการสด
Raghav Sood

2
Raghav Sood ฉันคิดว่าคุณควรเพิ่มข้อความแสดงความคิดเห็นของคุณในคำตอบเนื่องจากอธิบายการใช้ super method ได้อย่างเข้าใจมากขึ้นสำหรับผู้เริ่มต้น อย่างน้อยฉันก็เข้าใจจากความคิดเห็นของคุณเท่านั้น :)
Ayaz Alifov

5

* onCreate(bundle)เมธอดคลาสที่ได้รับมาต้องเรียกใช้ superclass ของวิธีนี้ มันจะทำให้เกิดข้อยกเว้นSuperNotCalledExceptionหากไม่ได้ใช้คีย์เวิร์ด " super "

สำหรับการสืบทอดในJavaการแทนที่เมธอด superclass และเพื่อเรียกใช้เมธอดคลาสข้างต้นให้ใช้super.methodname()ในวิธีการแทนที่คลาสที่ได้รับ

คลาสของ Android ทำงานในลักษณะเดียวกัน โดยการขยายActivityชั้นเรียนที่มีonCreate(Bundle bundle)วิธีการที่มีรหัสที่มีความหมายเป็นลายลักษณ์อักษรและรันรหัสว่าในกิจกรรมที่กำหนดให้ใช้คำหลักซุปเปอร์ด้วยวิธีการ onCreate () super.onCreate(bundle)เช่น

นี่คือโค้ดที่เขียนด้วยonCreate()วิธีคลาสกิจกรรมและทีม Android Dev อาจเพิ่มโค้ดที่มีความหมายมากขึ้นในวิธีนี้ในภายหลัง ดังนั้นเพื่อให้สะท้อนถึงส่วนเสริมคุณควรเรียกใช้super.onCreate ()ในActivityชั้นเรียนของคุณ

protected void  onCreate(Bundle savedInstanceState) {
    mVisibleFromClient = mWindow.getWindowStyle().getBoolean(
    com.android.internal.R.styleable.Window_windowNoDisplay, true);
    mCalled = true;
}

boolean mVisibleFromClient = true;

/**
 * Controls whether this activity main window is visible.  This is intended
 * only for the special case of an activity that is not going to show a
 * UI itself, but can't just finish prior to onResume() because it needs
 * to wait for a service binding or such.  Setting this to false prevents the UI from being shown during that time.
 * 
 * <p>The default value for this is taken from the
 * {@link android.R.attr#windowNoDisplay} attribute of the activity's theme.
 */

นอกจากนี้ยังรักษาตัวแปรmCalledซึ่งหมายความว่าคุณได้เรียกใช้super.onCreate(savedBundleInstance)ในกิจกรรมของคุณ

final void performStart() {
    mCalled = false;
    mInstrumentation.callActivityOnStart(this);
    if (!mCalled) {
        throw new SuperNotCalledException(
            "Activity " + mComponent.toShortString() +
            " did not call through to super.onStart()");
    }
}

ดูซอร์สโค้ดที่นี่

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/app/Activity.java#Activity.onCreate%28android.os.Bundle%29


1

เนื่องจากเมื่อ super.onCreate () มันจะไปถึงคลาส Activity (คลาสหลักของกิจกรรมใด ๆ ) เพื่อโหลด SavedInstanceState และเรา normaly ไม่ได้ตั้งค่าสถานะอินสแตนซ์ใด ๆ ที่บันทึกไว้ แต่เฟรมเวิร์กของ Android สร้างวิธีที่เราควรจะเรียก ที่.


รหัสของคุณจะรวบรวมอย่างมีความสุขแม้ว่าคุณจะไม่ได้โทรsuper.onCreate(savedInstanceState)เว้นแต่คุณจะมีข้อผิดพลาดอื่น ๆ
Raghav Sood

1

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

เหตุผลที่ต้องเรียก super.onCreate (savedInstanceState) เนื่องจากโค้ดของคุณจะไม่คอมไพล์เป็นอย่างอื่น ;-)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.