ผมได้สร้างโครงการและการประยุกต์ใช้ Android ใน MainActivity.java> มันเป็นโทรonCreate()
super.onCreate(savedInstanceState)
ในฐานะผู้เริ่มต้นใครสามารถอธิบายได้ว่าจุดประสงค์ของบรรทัดข้างต้นคืออะไร?
ผมได้สร้างโครงการและการประยุกต์ใช้ Android ใน MainActivity.java> มันเป็นโทรonCreate()
super.onCreate(savedInstanceState)
ในฐานะผู้เริ่มต้นใครสามารถอธิบายได้ว่าจุดประสงค์ของบรรทัดข้างต้นคืออะไร?
คำตอบ:
ทุกกิจกรรมที่คุณทำจะเริ่มต้นด้วยลำดับวิธีการเรียกใช้ onCreate()
เป็นการโทรครั้งแรก
หนึ่งในกิจกรรมของแต่ละคนและทุกขยายandroid.app.Activity
ไม่ว่าโดยตรงหรือโดย subclassing subclass Activity
ของผู้อื่น
ใน Java เมื่อคุณสืบทอดจากคลาสคุณสามารถแทนที่เมธอดเพื่อรันโค้ดของคุณเองได้ ร่วมเป็นตัวอย่างที่ดีของนี้เป็นเอาชนะของวิธีการเมื่อขยายtoString()
java.lang.Object
เมื่อเราแทนที่เมธอดเรามีตัวเลือกในการแทนที่เมธอดในคลาสของเราอย่างสมบูรณ์หรือขยายเมธอดคลาสแม่ที่มีอยู่ การโทรsuper.onCreate(savedInstanceState);
จะเป็นการบอกให้ Dalvik VM รันโค้ดของคุณนอกเหนือจากโค้ดที่มีอยู่ใน onCreate () ของคลาสพาเรนต์ หากคุณเว้นบรรทัดนี้แสดงว่าโค้ดของคุณเท่านั้นที่รัน รหัสที่มีอยู่จะถูกละเว้นโดยสิ้นเชิง
อย่างไรก็ตามคุณต้องรวมการโทรขั้นสูงนี้ไว้ในวิธีการของคุณเพราะถ้าคุณไม่ทำเช่นนั้นonCreate()
โค้ดในActivity
จะไม่ทำงานและแอปของคุณจะประสบปัญหาทุกประเภทเช่นไม่มีบริบทที่กำหนดให้กับกิจกรรม (แม้ว่าคุณจะโดนSuperNotCalledException
ก่อนที่คุณจะมีโอกาสที่จะคิดออกว่าคุณมีบริบทไม่มีบริการ)
ในระยะสั้นคลาสของ Android อาจซับซ้อนอย่างไม่น่าเชื่อ โค้ดในคลาสเฟรมเวิร์กจะจัดการกับสิ่งต่างๆเช่นการวาด UI การทำความสะอาดบ้านและการดูแลรักษากิจกรรมและวงจรชีวิตของแอปพลิเคชัน super
การโทรช่วยให้นักพัฒนาสามารถเรียกใช้โค้ดที่ซับซ้อนนี้เบื้องหลังได้ในขณะที่ยังคงให้ความเป็นนามธรรมที่ดีสำหรับแอปของเราเอง
* 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()");
}
}
ดูซอร์สโค้ดที่นี่
เนื่องจากเมื่อ super.onCreate () มันจะไปถึงคลาส Activity (คลาสหลักของกิจกรรมใด ๆ ) เพื่อโหลด SavedInstanceState และเรา normaly ไม่ได้ตั้งค่าสถานะอินสแตนซ์ใด ๆ ที่บันทึกไว้ แต่เฟรมเวิร์กของ Android สร้างวิธีที่เราควรจะเรียก ที่.
super.onCreate(savedInstanceState)
เว้นแต่คุณจะมีข้อผิดพลาดอื่น ๆ
เป็นข้อมูลที่คุณต้องการส่งกลับไปยังแอปพลิเคชันของคุณผ่าน onCreate () หากกิจกรรมถูกทำลายและเริ่มต้นใหม่เนื่องจากเหตุผลโดยนัยบางประการ (เช่นไม่ใช่เพราะผู้ใช้กดปุ่มย้อนกลับ) การใช้ onSaveInstanceState () โดยทั่วไปคือการจัดการการหมุนหน้าจอตามค่าเริ่มต้นกิจกรรมต่างๆจะถูกทำลายและสร้างขึ้นใหม่เมื่อผู้ใช้เลื่อนแป้นพิมพ์ G1 ออก
เหตุผลที่ต้องเรียก super.onCreate (savedInstanceState) เนื่องจากโค้ดของคุณจะไม่คอมไพล์เป็นอย่างอื่น ;-)