onCreate คืออะไร (Bundle saveInstanceState)


122

ทุกคนสามารถช่วยเหลือฉันรู้เกี่ยวกับBundle savedInstanceStateในonCreate(Bundle savedInstanceState)ผมมือใหม่ใน Android ฉันพยายามทำความเข้าใจจาก developer.android.com แต่ฉันไม่สามารถที่จะเข้าใจ ใครสามารถทำให้มันง่ายขึ้น?


2
นี่คือวิดีโอที่ดี: youtube.com/watch?v=kkYIMZw9gzQ
Francisco Corrales Morales

คำตอบ:


106

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

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

แหล่ง


2
กิจกรรมอื่น ๆ ใช้ Bundle เดียวกันหรือไม่หากฉันเริ่มกิจกรรมอื่นจะส่งผ่าน Bundle จากกิจกรรมแรกหรือไม่
Francisco Corrales Morales

17

onCreate(Bundle savedInstanceState)คุณจะได้รับBundleโมฆะเมื่อกิจกรรมเริ่มต้นในครั้งแรกและจะถูกนำไปใช้เมื่อการวางแนวกิจกรรมเปลี่ยนไป .......

http://www.gitshah.com/2011/03/how-to-handle-screen-orientation_28.html

Android เป็นอีกวิธีหนึ่งที่สวยงามในการบรรลุเป้าหมายนี้ onSaveInstanceState()เพื่อให้บรรลุนี้เราจะต้องแทนที่วิธีที่เรียกว่า แพลตฟอร์ม Android ช่วยให้ผู้ใช้บันทึกสถานะอินสแตนซ์ใด ๆ สามารถบันทึกสถานะอินสแตนซ์ใน Bundle ได้ Bundle ถูกส่งผ่านเป็นอาร์กิวเมนต์ของเมธอด onSaveInstanceState

เราสามารถโหลดสถานะอินสแตนซ์ที่บันทึกไว้จาก Bundle ที่ส่งผ่านเป็นอาร์กิวเมนต์ของonCreateเมธอด นอกจากนี้เรายังสามารถโหลดสถานะอินสแตนซ์ที่บันทึกไว้ในonRestoreInstanceStateวิธีการ แต่ฉันจะทิ้งไว้ให้ผู้อ่านคิดออก


11
savedInstanceStateจะไม่nullถ้าonSavedInstanceState()ถูกเรียกว่าก่อนหน้านี้ การเปลี่ยนแปลงการวางแนวเป็นเพียงตัวอย่างเดียวที่อาจเกิดขึ้น
Alex Lockwood

1
@AlexLockwood ฉันพยายามคิดถึงสถานการณ์ทั้งหมดที่อาจเกิดขึ้น มีเอกสารประกอบหรือไม่? ตัวอย่างหนึ่งที่ฉันคิดได้คือหากผู้ใช้สลับแอปและกลับมา แต่กิจกรรมถูกทำลายเพื่อกู้คืนทรัพยากร ในกรณีนี้แอนดรอยด์จะสร้างกิจกรรมใหม่ด้วยบันเดิลหาก onSaveInsanceState () ถูกทับใช่ไหม
batbrat

1
@batbrat ใช่ ... ความคิดเห็นที่ฉันทำ (เกือบสองปีที่แล้ว) ไม่ถูกต้องทั้งหมด ฉันเดาว่าวิธีที่ดีที่สุดในการใส่คือBundleอาร์กิวเมนต์onCreate(Bundle)จะไม่ใช่nullif และเฉพาะในกรณีที่ActivityมีonSaveInstanceStateการเรียกใช้เมธอดก่อนหน้านี้เท่านั้น สิ่งนี้เกิดขึ้นระหว่างการเปลี่ยนแปลงการวางแนว ... และยังเกิดขึ้นเมื่อกิจกรรมกลับมาหลังจากที่ถูกฆ่าโดย OS และเมื่อคุณทริกเกอร์การเปลี่ยนแปลงการกำหนดค่าอื่น ๆ ที่น่าสนใจบนอุปกรณ์ของคุณ
Alex Lockwood

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

15

ตามที่ Dhruv Gairola ตอบคุณสามารถบันทึกสถานะของแอปพลิเคชันได้โดยใช้ Bundle savedInstanceState ฉันพยายามยกตัวอย่างง่ายๆที่ผู้เรียนใหม่อย่างฉันสามารถเข้าใจได้ง่าย

สมมติว่าคุณมีส่วนง่ายๆที่มี TextView และปุ่ม ทุกครั้งที่คุณคลิกปุ่มข้อความจะเปลี่ยนไป ตอนนี้เปลี่ยนการวางแนวของอุปกรณ์ / โปรแกรมจำลองของคุณและสังเกตว่าคุณสูญเสียข้อมูล (หมายถึงข้อมูลที่เปลี่ยนแปลงหลังจากคลิกที่คุณได้รับ) และส่วนเริ่มต้นเป็นครั้งแรกอีกครั้ง โดยใช้ Bundle saveInstanceState เราสามารถกำจัดสิ่งนี้ได้ หากคุณดูชีวิตของชิ้นส่วน Fragment Lifecylceคุณจะได้รับเมธอด "onSaveInstanceState" ถูกเรียกเมื่อแฟรกเมนต์กำลังจะถูกทำลาย

ดังนั้นเราสามารถบันทึกสถานะหมายถึงค่าข้อความที่เปลี่ยนแปลงลงในบันเดิลนั้นเช่นนี้

 int counter  = 0;
 @Override
 public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("value",counter);
 }

หลังจากที่คุณทำการวางแนวแล้วเมธอด "onCreate" จะถูกเรียกใช่ไหม เราก็ทำได้

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if(savedInstanceState == null){
        //it is the first time the fragment is being called
        counter = 0;
    }else{
        //not the first time so we will check SavedInstanceState bundle
        counter = savedInstanceState.getInt("value",0); //here zero is the default value
    }
}

ตอนนี้คุณจะไม่สูญเสียคุณค่าของคุณหลังจากการวางแนว ค่าที่แก้ไขจะแสดงเสมอ


โปรดสังเกตว่าสิ่งนี้ถือเป็นจริงในกิจกรรมด้วย คุณสามารถอธิบายเพิ่มเติมเกี่ยวกับความแตกต่างของ (Bundle of Activity) และ Bundle of Fragment ได้หรือไม่?
laalaguer

คุณจะได้รับความเข้าใจที่ชัดเจนจากวงจรชีวิตของกิจกรรมและส่วนที่กิจกรรมสามารถแสดงชิ้นส่วนได้หลายชิ้นในแต่ละครั้งดังนั้นความแตกต่างพื้นฐานคือคุณอาจต้องการบันทึกค่าบางอย่างสำหรับส่วนทั้งหมดของกิจกรรมจากนั้นคุณจะ ใช้บันเดิลของกิจกรรมมิฉะนั้นคุณควรใช้บันเดิลของแฟรกเมนต์หากเป็นแฟรกเมนต์เฉพาะ
Asad

5

onCreate (Bundle savedInstanceState) ฟังก์ชันใน Android:

1) เมื่อมีการเรียกใช้กิจกรรมครั้งแรกหรือเรียกใช้เมธอด onCreate (Bundle savedInstanceState) มีหน้าที่สร้างกิจกรรม

2) เมื่อการวางแนว (เช่นจากแนวนอนเป็นแนวตั้งหรือแนวตั้งเป็นแนวนอน) ของกิจกรรมได้รับการเปลี่ยนแปลงหรือเมื่อระบบปฏิบัติการใด ๆ ยุติกิจกรรมอย่างมีพลังจากนั้นจึงบันทึก

3) หลังจากการวางแนวเปลี่ยนไปแล้ว onCreate (Bundle savedInstanceState) จะเรียกและสร้างกิจกรรมใหม่และโหลดข้อมูลทั้งหมดจากที่บันทึกไว้

4) โดยทั่วไปคลาส Bundle จะใช้ในการจัดเก็บข้อมูลของกิจกรรมเมื่อใดก็ตามที่เงื่อนไขข้างต้นเกิดขึ้นในแอพ

5) onCreate () ไม่จำเป็นสำหรับแอป แต่เหตุผลที่ใช้ในแอพเพราะวิธีนั้นเป็นที่ที่ดีที่สุดในการใส่รหัสเริ่มต้น

6) คุณสามารถใส่รหัสเริ่มต้นของคุณใน onStart () หรือ onResume () และเมื่อคุณจะโหลดแอปก่อนมันจะทำงานเหมือนกับใน onCreate ()


4

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


0

onCreate (Bundle savedInstanceState) ได้รับการเรียกและบันทึกไว้แล้ว จากนั้นแอปของคุณจะสามารถคว้า (จับ) ข้อมูลจากบันทึกไว้แล้วสร้างกิจกรรมของคุณได้

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