สิ่งที่จะบันทึกและสิ่งที่จะไม่?
เคยสงสัยไหมว่าทำไมข้อความในไฟล์นั้นถึงEditText
ถูกบันทึกโดยอัตโนมัติในขณะที่การวางแนวนั้นเปลี่ยนไป? คำตอบนี้เหมาะสำหรับคุณ
เมื่ออินสแตนซ์ของกิจกรรมถูกทำลายและระบบจะสร้างอินสแตนซ์ใหม่ (ตัวอย่างเช่นการเปลี่ยนแปลงการกำหนดค่า) พยายามสร้างใหม่โดยใช้ชุดข้อมูลที่บันทึกของสถานะกิจกรรมเก่า ( สถานะอินสแตนซ์ )
สถานะอินสแตนซ์คือชุดของคู่ของคีย์ - ค่าที่เก็บไว้ในBundle
วัตถุ
ตามค่าเริ่มต้นระบบจะบันทึกวัตถุมุมมองในชุดรวมตัวอย่างเช่น
- ข้อความใน
EditText
- เลื่อนตำแหน่งใน
ListView
, ฯลฯ
หากคุณต้องการตัวแปรอื่นที่จะบันทึกเป็นส่วนหนึ่งของสถานะอินสแตนซ์คุณควรเอาชนะ onSavedInstanceState(Bundle savedinstaneState)
ใช้วิธี
ตัวอย่างเช่น, int currentScore
ใน GameActivity
รายละเอียดเพิ่มเติมเกี่ยวกับ onSavedInstanceState (บันเดิลที่บันทึกไว้ใน stane) ในขณะที่บันทึกข้อมูล
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the user's current game state
savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}
ดังนั้นโดยไม่ได้ตั้งใจถ้าคุณลืมที่จะเรียก
super.onSaveInstanceState(savedInstanceState);
พฤติกรรมเริ่มต้นจะไม่ทำงานเช่นข้อความใน EditText จะไม่ถูกบันทึก
ตัวเลือกใดสำหรับการกู้คืนสถานะกิจกรรม
onCreate(Bundle savedInstanceState)
หรือ
onRestoreInstanceState(Bundle savedInstanceState)
ทั้งสองวิธีรับวัตถุ Bundle เดียวกันดังนั้นจึงไม่สำคัญว่าคุณจะเขียนตรรกะการกู้คืนที่ใด ข้อแตกต่างคือในonCreate(Bundle savedInstanceState)
วิธีที่คุณจะต้องให้การตรวจสอบเป็นโมฆะในขณะที่มันไม่จำเป็นในกรณีหลัง คำตอบอื่น ๆ มีตัวอย่างโค้ดอยู่แล้ว คุณสามารถอ้างอิงได้
รายละเอียดเพิ่มเติมเกี่ยวกับ onRestoreInstanceState (บันเดิลที่บันทึกไว้ใน staneState)
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
// Always call the superclass so it can restore the view hierarchy
super.onRestoreInstanceState(savedInstanceState);
// Restore state members from the saved instance
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
}
เรียกใช้เสมอsuper.onRestoreInstanceState(savedInstanceState);
เพื่อให้ระบบกู้คืนมุมมองลำดับชั้นตามค่าเริ่มต้น
โบนัส
ระบบonSaveInstanceState(Bundle savedInstanceState)
ถูกเรียกใช้เมื่อผู้ใช้ตั้งใจที่จะกลับมาที่กิจกรรม ตัวอย่างเช่นคุณใช้แอพ X และคุณได้รับสาย คุณย้ายไปที่แอพผู้โทรและกลับมาที่แอพ X ในกรณีนี้onSaveInstanceState(Bundle savedInstanceState)
วิธีการจะถูกเรียกใช้
แต่ให้พิจารณาสิ่งนี้หากผู้ใช้กดปุ่มย้อนกลับ สันนิษฐานว่าผู้ใช้ไม่ได้ตั้งใจที่จะกลับมาที่กิจกรรมดังนั้นในกรณีนี้ระบบonSaveInstanceState(Bundle savedInstanceState)
จะไม่ถูกเรียกใช้ คุณควรพิจารณาถึงสถานการณ์ทั้งหมดในขณะที่กำลังบันทึกข้อมูล
ลิงค์ที่เกี่ยวข้อง:
การสาธิตการทำงานเริ่มต้นเอกสาร
Android อย่างเป็นทางการ