1. ยินดีต้อนรับ
Codelab ที่นำไปใช้ได้จริงนี้เป็นส่วนหนึ่งของหน่วยที่ 1: เริ่มต้นใช้งานในหลักสูตร Android Developer Fundamentals (เวอร์ชัน 2) คุณจะได้รับประโยชน์สูงสุดจากหลักสูตรนี้หากทำตามลำดับใน Codelab
- ดูรายการ Codelab ทั้งหมดในหลักสูตรได้ที่ Codelabs สําหรับพื้นฐานสําหรับนักพัฒนาแอป Android (V2)
- ดูรายละเอียดเกี่ยวกับหลักสูตร รวมถึงลิงก์ไปยังบทแนวคิด แอป และภาพนิ่งทั้งหมดได้ที่ Android Developer Fundamentals (เวอร์ชัน 2)
บทนำ
ในภาคปฏิบัตินี้ คุณจะได้เรียนรู้เพิ่มเติมเกี่ยวกับวงจรกิจกรรม วงจรคือชุดสถานะที่กิจกรรมหนึ่งๆ อาจมีได้ตลอดอายุการใช้งาน ตั้งแต่สร้างจนถึงทำลายและระบบเรียกคืนทรัพยากร เมื่อผู้ใช้ไปยังส่วนต่างๆ ของกิจกรรมในแอป (รวมถึงเข้าและออกจากแอป) กิจกรรมจะเปลี่ยนสถานะต่างๆ ในวงจร
แต่ละระยะในวงจรชีวิตของกิจกรรมจะมีเมธอดการเรียกคืนที่เกี่ยวข้อง เช่น onCreate(), onStart(), onPause() และอื่นๆ เมื่อกิจกรรมเปลี่ยนสถานะ ระบบจะเรียกใช้เมธอด Callback ที่เชื่อมโยง คุณได้ดูวิธีการอย่างใดอย่างหนึ่งแล้ว ซึ่งก็คือ onCreate() การลบล้างเมธอดการเรียกกลับของวงจรชีวิตในคลาสกิจกรรมจะช่วยให้คุณเปลี่ยนลักษณะการทำงานเริ่มต้นของกิจกรรมเพื่อตอบสนองต่อการกระทำของผู้ใช้หรือระบบได้
สถานะกิจกรรมยังเปลี่ยนแปลงตามการเปลี่ยนแปลงการกําหนดค่าอุปกรณ์ได้ด้วย เช่น เมื่อผู้ใช้หมุนอุปกรณ์จากแนวตั้งเป็นแนวนอน เมื่อเกิดการเปลี่ยนแปลงการกําหนดค่าเหล่านี้ ระบบจะทำลายกิจกรรมและสร้างใหม่ในสถานะเริ่มต้น และผู้ใช้อาจสูญเสียข้อมูลที่ป้อนในกิจกรรม คุณควรพัฒนาแอปเพื่อป้องกันการสูญเสียข้อมูลโดยไม่คาดคิดเพื่อไม่ให้ผู้ใช้สับสน ในภาคปฏิบัติช่วงต่อๆ ไป คุณจะทดสอบการเปลี่ยนแปลงการกําหนดค่าและเรียนรู้วิธีรักษาสถานะของกิจกรรมเพื่อตอบสนองต่อการเปลี่ยนแปลงการกําหนดค่าอุปกรณ์และเหตุการณ์อื่นๆ ในวงจรกิจกรรม
ในภาคปฏิบัตินี้ คุณจะเพิ่มคำสั่งการบันทึกลงในแอป TwoActivities และสังเกตการเปลี่ยนแปลงวงจรของกิจกรรมขณะใช้แอป จากนั้นจะเริ่มทํางานกับการเปลี่ยนแปลงเหล่านี้และสำรวจวิธีจัดการอินพุตของผู้ใช้ภายใต้เงื่อนไขเหล่านี้
ข้อกำหนดเบื้องต้น
คุณควรทำสิ่งต่อไปนี้ได้
- สร้างและเรียกใช้โปรเจ็กต์แอปใน Android Studio
- เพิ่มคำสั่งบันทึกลงในแอปและดูบันทึกเหล่านั้นในแผง Logcat
- ทําความเข้าใจและทํางานกับกิจกรรมและ Intent รวมถึงโต้ตอบกับกิจกรรมและ Intent ได้อย่างคล่องแคล่ว
สิ่งที่คุณจะได้เรียนรู้
- วงจรชีวิตของกิจกรรม
- เมื่อกิจกรรมเริ่ม หยุดชั่วคราว หยุด และถูกทำลาย
- เกี่ยวกับเมธอดการเรียกกลับเกี่ยวกับวงจรที่เกี่ยวข้องกับการเปลี่ยนแปลงของกิจกรรม
- ผลของการดำเนินการ (เช่น การเปลี่ยนแปลงการกำหนดค่า) ที่อาจส่งผลให้เกิดเหตุการณ์ในวงจรของกิจกรรม
- วิธีเก็บสถานะกิจกรรมไว้ตลอดเหตุการณ์ในวงจรของลูกค้า
สิ่งที่ต้องทำ
- เพิ่มโค้ดลงในแอป TwoActivities จากภาคปฏิบัติก่อนหน้านี้เพื่อใช้การเรียกกลับวงจรของกิจกรรมต่างๆ เพื่อรวมคำสั่งการบันทึก
- สังเกตการเปลี่ยนแปลงสถานะขณะที่แอปทำงานและขณะที่คุณโต้ตอบกับกิจกรรมแต่ละรายการในแอป
- แก้ไขแอปเพื่อเก็บสถานะอินสแตนซ์ของกิจกรรมที่สร้างขึ้นมาใหม่โดยไม่คาดคิดเพื่อตอบสนองต่อพฤติกรรมของผู้ใช้หรือการเปลี่ยนแปลงการกำหนดค่าในอุปกรณ์
2. ภาพรวมของแอป
ในภาคปฏิบัตินี้ คุณจะต้องเพิ่มลงในแอป TwoActivities แอปจะมีลักษณะและทํางานคล้ายกับในโค้ดแล็บครั้งล่าสุด ประกอบด้วยการใช้งานกิจกรรม 2 รายการและช่วยให้ผู้ใช้สามารถส่งระหว่างกิจกรรมได้ การเปลี่ยนแปลงที่คุณทำกับแอปในการฝึกปฏิบัตินี้จะไม่ส่งผลต่อลักษณะการทํางานของผู้ใช้ที่มองเห็นได้
3. 3. งาน 1: เพิ่มการเรียกกลับวงจรชีวิตของ TwoActivities
ในงานนี้ คุณจะใช้เมธอดการเรียกกลับของวงจรชีวิตของ Activity ทั้งหมดเพื่อพิมพ์ข้อความไปยัง Logcat เมื่อมีการเรียกใช้เมธอดเหล่านั้น ข้อความบันทึกเหล่านี้จะช่วยให้คุณเห็นว่าวงจรของกิจกรรมมีการเปลี่ยนแปลงสถานะเมื่อใด และการเปลี่ยนแปลงสถานะวงจรเหล่านั้นส่งผลต่อแอปอย่างไรขณะที่ทำงาน
1.1 (ไม่บังคับ) คัดลอกโปรเจ็กต์ TwoActivities
สำหรับงานในภาคปฏิบัตินี้ คุณจะแก้ไขโปรเจ็กต์ TwoActivities ที่มีอยู่ซึ่งคุณสร้างในภาคปฏิบัติครั้งล่าสุด หากต้องการเก็บโปรเจ็กต์ TwoActivities ก่อนหน้าไว้ ให้ทำตามขั้นตอนในภาคผนวก: ยูทิลิตีเพื่อสร้างสำเนาของโปรเจ็กต์
1.2 ใช้การเรียกกลับใน MainActivity
- เปิดโปรเจ็กต์ TwoActivities ใน Android Studio แล้วเปิด MainActivity ในแผงโปรเจ็กต์ > Android
- ในเมธอด onCreate() ให้เพิ่มคำสั่งบันทึกต่อไปนี้
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "onCreate");
- เพิ่มการลบล้างสําหรับการเรียกกลับ onStart() พร้อมคำสั่งในบันทึกสําหรับเหตุการณ์นั้น
@Override
public void onStart(){
super.onStart();
Log.d(LOG_TAG, "onStart");
}
หากต้องการใช้ทางลัด ให้เลือก "โค้ด" > "ลบล้างเมธอด" ใน Android Studio กล่องโต้ตอบจะปรากฏขึ้นพร้อมเมธอดทั้งหมดที่คุณลบล้างได้ในคลาส การเลือกเมธอดการเรียกคืนอย่างน้อย 1 เมธอดจากรายการจะแทรกเทมเพลตที่สมบูรณ์สำหรับเมธอดเหล่านั้น รวมถึงการเรียกใช้คลาสซุปเปอร์ที่จำเป็น
- ใช้เมธอด onStart() เป็นเทมเพลตเพื่อใช้การเรียกกลับของวงจรการทํางาน onPause(), onRestart(), onResume(), onStop() และ onDestroy()
เมธอดการเรียกกลับทั้งหมดมีลายเซ็นเหมือนกัน (ยกเว้นชื่อ) หากคุณคัดลอกและวาง onStart() เพื่อสร้างเมธอดการเรียกคืนอื่นๆ เหล่านี้ อย่าลืมอัปเดตเนื้อหาเพื่อเรียกใช้เมธอดที่ถูกต้องในซุปเปอร์คลาส และบันทึกเมธอดที่ถูกต้อง
- เรียกใช้แอป
- คลิกแท็บ Logcat ที่ด้านล่างของ Android Studio เพื่อแสดงแผง Logcat คุณควรเห็นข้อความบันทึก 3 รายการที่แสดงสถานะวงจรของลูกค้า 3 สถานะที่กิจกรรมได้เปลี่ยนผ่านเมื่อเริ่มต้น
D/MainActivity: -------
D/MainActivity: onCreate
D/MainActivity: onStart
D/MainActivity: onResume
1.3 ใช้ Lifecycle Callback ใน SecondActivity
เมื่อคุณใช้เมธอดการเรียกกลับของวงจรสำหรับ MainActivity แล้ว ให้ทำเช่นเดียวกันกับ SecondActivity
- เปิด SecondActivity
- ที่ด้านบนของคลาส ให้เพิ่มค่าคงที่สําหรับตัวแปร LOG_TAG ดังนี้
private static final String LOG_TAG = SecondActivity.class.getSimpleName();
- เพิ่มการเรียกกลับของวงจรและคำสั่งบันทึกลงในกิจกรรมที่ 2 (คุณสามารถคัดลอกและวางวิธีการเรียกกลับจาก MainActivity ได้)
- เพิ่มคำสั่งบันทึกลงในเมธอด returnReply() ก่อนเมธอด finish() ดังนี้
Log.d(LOG_TAG, "End SecondActivity");
1.4 ดูบันทึกขณะที่แอปทำงาน**
- เรียกใช้แอป
- คลิกแท็บ Logcat ที่ด้านล่างของ Android Studio เพื่อแสดงแผง Logcat
- ป้อน "กิจกรรม" ในช่องค้นหา ข้อมูล Logcat ของ Android อาจยาวและรกมาก เนื่องจากตัวแปร LOG_TAG ในแต่ละคลาสมีคำว่า MainActivity หรือ SecondActivity คีย์เวิร์ดนี้จึงช่วยให้คุณกรองบันทึกเฉพาะสิ่งที่สนใจได้
ทดสอบการใช้แอปและสังเกตเหตุการณ์ในวงจรที่เกิดขึ้นเพื่อตอบสนองต่อการดำเนินการต่างๆ โดยเฉพาะอย่างยิ่ง ให้ลองทำสิ่งต่อไปนี้
- ใช้แอปตามปกติ (ส่งข้อความ ตอบกลับด้วยข้อความอื่น)
- ใช้ปุ่มย้อนกลับเพื่อกลับจากกิจกรรมที่ 2 ไปยังกิจกรรมหลัก
- ใช้ปุ่มลูกศรขึ้นในแถบแอปเพื่อกลับจากกิจกรรมที่ 2 ไปยังกิจกรรมหลัก
- หมุนอุปกรณ์ทั้งในกิจกรรมหลักและกิจกรรมที่ 2 ในเวลาที่ต่างกันในแอป แล้วสังเกตสิ่งที่เกิดขึ้นในบันทึกและบนหน้าจอ
- กดปุ่มภาพรวม (ปุ่มสี่เหลี่ยมจัตุรัสด้านขวาของ "บ้าน") แล้วปิดแอป (แตะ X)
- กลับไปที่หน้าจอหลักแล้วเปิดแอปอีกครั้ง
เคล็ดลับ: หากเรียกใช้แอปในโปรแกรมจำลอง คุณสามารถจำลองการหมุนด้วยแป้น Control+F11 หรือ Control+Function+F11
รหัสโซลูชันของงาน 1
ข้อมูลโค้ดต่อไปนี้แสดงโค้ดโซลูชันสำหรับงานแรก
กิจกรรมหลัก
ข้อมูลโค้ดต่อไปนี้แสดงโค้ดที่เพิ่มใน MainActivity แต่ไม่ใช่ทั้งคลาส
เมธอด onCreate()
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Log the start of the onCreate() method.
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "onCreate");
// Initialize all the view variables.
mMessageEditText = findViewById(R.id.editText_main);
mReplyHeadTextView = findViewById(R.id.text_header_reply);
mReplyTextView = findViewById(R.id.text_message_reply);
}
วิธีการอื่นๆ ของวงจร ได้แก่
@Override
protected void onStart() {
super.onStart();
Log.d(LOG_TAG, "onStart");
}
@Override
protected void onPause() {
super.onPause();
Log.d(LOG_TAG, "onPause");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(LOG_TAG, "onRestart");
}
@Override
protected void onResume() {
super.onResume();
Log.d(LOG_TAG, "onResume");
}
@Override
protected void onStop() {
super.onStop();
Log.d(LOG_TAG, "onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(LOG_TAG, "onDestroy");
}
SecondActivity
ข้อมูลโค้ดต่อไปนี้แสดงโค้ดที่เพิ่มใน SecondActivity แต่ไม่ใช่ทั้งคลาส
ที่ด้านบนของคลาส SecondActivity ให้ทำดังนี้
private static final String LOG_TAG = SecondActivity.class.getSimpleName();
เมธอด returnReply()
public void returnReply(View view) {
String reply = mReply.getText().toString();
Intent replyIntent = new Intent();
replyIntent.putExtra(EXTRA_REPLY, reply);
setResult(RESULT_OK, replyIntent);
Log.d(LOG_TAG, "End SecondActivity");
finish();
}
วิธีการอื่นๆ ของวงจร ได้แก่
เหมือนกับ MainActivity ด้านบน
4. 4. ขั้นตอนที่ 2: บันทึกและกู้คืนสถานะอินสแตนซ์ของกิจกรรม
กิจกรรมแต่ละรายการในแอปอาจถูกทำลายและสร้างขึ้นใหม่บ่อยกว่าที่คุณคิด ทั้งนี้ขึ้นอยู่กับทรัพยากรของระบบและพฤติกรรมของผู้ใช้
คุณอาจสังเกตเห็นลักษณะการทำงานนี้ในส่วนที่แล้วเมื่อหมุนอุปกรณ์หรือโปรแกรมจำลอง การหมุนอุปกรณ์เป็นตัวอย่างหนึ่งของการเปลี่ยนแปลงการกำหนดค่าอุปกรณ์ แม้ว่าการหมุนเวียนจะเป็นวิธีที่ใช้กันมากที่สุด แต่การเปลี่ยนแปลงการกําหนดค่าทั้งหมดจะทําให้กิจกรรมปัจจุบันถูกทำลายและสร้างใหม่ราวกับเป็นกิจกรรมใหม่ หากคุณไม่ได้คำนึงถึงลักษณะการทำงานนี้ในโค้ด เมื่อเกิดการเปลี่ยนแปลงการกำหนดค่า เลย์เอาต์กิจกรรมอาจเปลี่ยนกลับไปเป็นลักษณะที่ปรากฏและค่าเริ่มต้น และผู้ใช้อาจสูญเสียตำแหน่ง ข้อมูล หรือสถานะความคืบหน้าในแอป
ระบบจะจัดเก็บสถานะของกิจกรรมแต่ละรายการเป็นชุดคู่คีย์/ค่าในออบเจ็กต์ Bundle ที่เรียกว่าสถานะอินสแตนซ์ของกิจกรรม ระบบจะบันทึกข้อมูลสถานะเริ่มต้นไว้ใน Bundle สถานะอินสแตนซ์ก่อนที่กิจกรรมจะหยุดลง และส่ง Bundle นั้นไปยังอินสแตนซ์กิจกรรมใหม่เพื่อกู้คืน
หากไม่ต้องการให้ข้อมูลในกิจกรรมสูญหายเมื่อระบบทำลายและสร้างกิจกรรมขึ้นมาใหม่โดยไม่คาดคิด คุณต้องใช้เมธอด onSaveInstanceState() ระบบจะเรียกใช้เมธอดนี้ใน Activity (ระหว่าง onPause() กับ onStop()) เมื่อมีความเป็นไปได้ที่ Activity อาจถูกทำลายและสร้างใหม่
ข้อมูลที่บันทึกไว้ในสถานะอินสแตนซ์จะเจาะจงสำหรับอินสแตนซ์ของกิจกรรมนี้เท่านั้นในระหว่างเซสชันแอปปัจจุบัน เมื่อหยุดและเริ่มเซสชันแอปใหม่ สถานะอินสแตนซ์ของกิจกรรมจะหายไปและกิจกรรมจะเปลี่ยนกลับไปเป็นลักษณะที่ปรากฏเริ่มต้น หากต้องการบันทึกข้อมูลผู้ใช้ระหว่างเซสชันของแอป ให้ใช้ค่ากําหนดที่ใช้ร่วมกันหรือฐานข้อมูล คุณจะได้เรียนรู้เกี่ยวกับทั้ง 2 รูปแบบนี้ในการฝึกปฏิบัติในภายหลัง
2.1 บันทึกสถานะอินสแตนซ์ของกิจกรรมด้วย onSaveInstanceState()
คุณอาจสังเกตเห็นว่าการหมุนอุปกรณ์ไม่ส่งผลต่อสถานะของกิจกรรมที่ 2 เลย เนื่องจากเลย์เอาต์และสถานะของกิจกรรมที่ 2 สร้างขึ้นจากเลย์เอาต์และ Intent ที่เปิดใช้งาน แม้ว่าจะสร้างกิจกรรมขึ้นมาใหม่ Intent จะยังคงอยู่และระบบจะใช้ข้อมูลใน Intent นั้นทุกครั้งที่มีการเรียกใช้เมธอด onCreate() ในกิจกรรมที่ 2
นอกจากนี้ คุณอาจสังเกตเห็นว่าในกิจกรรมแต่ละรายการ ระบบจะเก็บข้อความที่คุณพิมพ์ลงในองค์ประกอบ EditText ของข้อความหรือตอบกลับไว้ แม้ว่าจะหมุนอุปกรณ์ก็ตาม เนื่องจากระบบจะบันทึกข้อมูลสถานะขององค์ประกอบ View บางรายการในเลย์เอาต์โดยอัตโนมัติเมื่อมีการเปลี่ยนแปลงการกําหนดค่า และค่าปัจจุบันของ EditText เป็นหนึ่งในกรณีเหล่านั้น
ดังนั้นสถานะกิจกรรมที่คุณสนใจมีเพียงองค์ประกอบ TextView สำหรับส่วนหัวของคำตอบและข้อความตอบในกิจกรรมหลัก องค์ประกอบ TextView ทั้ง 2 รายการจะมองไม่เห็นโดยค่าเริ่มต้น และจะปรากฏขึ้นก็ต่อเมื่อคุณส่งข้อความกลับไปยังกิจกรรมหลักจากกิจกรรมที่ 2 เท่านั้น
ในงานนี้ คุณจะต้องเพิ่มโค้ดเพื่อเก็บสถานะอินสแตนซ์ขององค์ประกอบ TextView 2 รายการนี้โดยใช้ onSaveInstanceState()
- เปิด MainActivity
- เพิ่มการใช้งานโครงร่างของ onSaveInstanceState() นี้ลงในกิจกรรม หรือใช้ "โค้ด" > "วิธีการลบล้าง" เพื่อแทรกการลบล้างโครงร่าง
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
- ตรวจสอบว่าส่วนหัวแสดงอยู่หรือไม่ หากใช่ ให้ใส่สถานะการแสดงผลนั้นไว้ใน Bundle สถานะด้วยเมธอด putBoolean() และคีย์ "reply_visible"
if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
outState.putBoolean("reply_visible", true);
}
โปรดทราบว่าระบบจะทําเครื่องหมายส่วนหัวและข้อความการตอบกลับให้มองไม่เห็นจนกว่าจะมีการตอบกลับจากกิจกรรมที่ 2 หากเห็นส่วนหัว แสดงว่าระบบมีข้อมูลการตอบกลับที่ต้องบันทึก โปรดทราบว่าเราสนใจเฉพาะสถานะการแสดงผลนั้นๆ เท่านั้น ไม่จำเป็นต้องบันทึกข้อความจริงของส่วนหัวเนื่องจากข้อความนั้นไม่มีการเปลี่ยนแปลง
- เพิ่มข้อความตอบกลับลงใน Bundle ภายในการตรวจสอบเดียวกัน
outState.putString("reply_text",mReplyTextView.getText().toString());
หากเห็นส่วนหัว แสดงว่าข้อความตอบกลับก็แสดงอยู่ด้วย คุณไม่จําเป็นต้องทดสอบหรือบันทึกสถานะการแสดงผลปัจจุบันของข้อความตอบ เฉพาะข้อความจริงของข้อความเท่านั้นที่จะเข้าสู่ Bundle สถานะที่มีคีย์ "reply_text"
คุณจะบันทึกสถานะขององค์ประกอบในมุมมองที่อาจเปลี่ยนแปลงหลังจากสร้างกิจกรรมเท่านั้น องค์ประกอบ View อื่นๆ ในแอป (EditText, ปุ่ม) สามารถสร้างใหม่จากเลย์เอาต์เริ่มต้นได้ทุกเมื่อ
โปรดทราบว่าระบบจะบันทึกสถานะขององค์ประกอบ View บางรายการ เช่น เนื้อหาของ EditText
2.2 กู้คืนสถานะอินสแตนซ์ของกิจกรรมใน onCreate()
เมื่อบันทึกสถานะอินสแตนซ์ของกิจกรรมแล้ว คุณจะต้องกู้คืนสถานะดังกล่าวด้วยเมื่อสร้างกิจกรรมขึ้นมาใหม่ ซึ่งทำได้ใน onCreate() หรือใช้การเรียกกลับ onRestoreInstanceState() ซึ่งจะเรียกหลังจาก onStart() หลังจากที่สร้าง Activity แล้ว
ส่วนใหญ่แล้ว ตำแหน่งที่ดีกว่าในการกู้คืนสถานะของกิจกรรมคือ onCreate() เพื่อให้ UI รวมถึงสถานะพร้อมใช้งานโดยเร็วที่สุด บางครั้งการเรียกใช้เมธอดนี้ใน onRestoreInstanceState() หลังจากการเริ่มต้นทั้งหมดเสร็จสิ้นแล้ว หรือเพื่ออนุญาตให้คลาสย่อยตัดสินใจว่าจะใช้การใช้งานเริ่มต้นของคุณหรือไม่ อาจเป็นวิธีที่สะดวก
- ในเมธอด onCreate() หลังจากเริ่มต้นตัวแปร View ด้วย findViewById() แล้ว ให้เพิ่มการทดสอบเพื่อให้แน่ใจว่า savedInstanceState ไม่ใช่ค่า Null
// Initialize all the view variables.
mMessageEditText = findViewById(R.id.editText_main);
mReplyHeadTextView = findViewById(R.id.text_header_reply);
mReplyTextView = findViewById(R.id.text_message_reply);
// Restore the state.
if (savedInstanceState != null) {
}
เมื่อสร้างกิจกรรมแล้ว ระบบจะส่ง Bundle สถานะไปยัง onCreate() เป็นอาร์กิวเมนต์เดียว เมื่อมีการเรียก onCreate() เป็นครั้งแรกและแอปเริ่มทำงาน Bundle จะว่างเปล่า นั่นคือไม่มีสถานะใดๆ อยู่เมื่อแอปเริ่มทำงานเป็นครั้งแรก การเรียก onCreate() ครั้งต่อๆ ไปจะมีการสร้าง Bundle ด้วยข้อมูลที่เก็บไว้ใน onSaveInstanceState()
- ภายในการตรวจสอบนั้น ให้รับการแสดงผลปัจจุบัน (จริงหรือเท็จ) จาก Bundle ด้วยคีย์ "reply_visible"
if (savedInstanceState != null) {
boolean isVisible =
savedInstanceState.getBoolean("reply_visible");
}
- เพิ่มการทดสอบด้านล่างบรรทัดก่อนหน้าสําหรับตัวแปร isVisible
if (isVisible) {
}
หากมีคีย์ reply_visible ใน Bundle สถานะ (และ isVisible จึงเป็นจริง) คุณจะต้องกู้คืนสถานะ
- ในการทดสอบ isVisible ให้ทําให้ส่วนหัวมองเห็นได้
mReplyHeadTextView.setVisibility(View.VISIBLE);
- รับข้อความตอบกลับที่เป็นข้อความจาก Bundle ที่มีคีย์ "reply_text" และตั้งค่า TextView ของคำตอบให้แสดงสตริงนั้น
mReplyTextView.setText(savedInstanceState.getString("reply_text"));
- ทําให้ TextView ของคําตอบแสดงด้วย
mReplyTextView.setVisibility(View.VISIBLE);
- เรียกใช้แอป แล้วลองหมุนอุปกรณ์หรือโปรแกรมจำลองเพื่อให้แน่ใจว่าข้อความตอบกลับ (หากมี) ยังคงอยู่บนหน้าจอหลังจากสร้างกิจกรรมอีกครั้ง
รหัสโซลูชันของงาน 2
ข้อมูลโค้ดต่อไปนี้แสดงโค้ดโซลูชันสําหรับงานนี้
กิจกรรมหลัก
ข้อมูลโค้ดต่อไปนี้แสดงโค้ดที่เพิ่มใน MainActivity แต่ไม่ใช่ทั้งคลาส
เมธอด onSaveInstanceState()
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// If the heading is visible, message needs to be saved.
// Otherwise we're still using default layout.
if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
outState.putBoolean("reply_visible", true);
outState.putString("reply_text",
mReplyTextView.getText().toString());
}
}
เมธอด onCreate()
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "onCreate");
// Initialize all the view variables.
mMessageEditText = findViewById(R.id.editText_main);
mReplyHeadTextView = findViewById(R.id.text_header_reply);
mReplyTextView = findViewById(R.id.text_message_reply);
// Restore the saved state.
// See onSaveInstanceState() for what gets saved.
if (savedInstanceState != null) {
boolean isVisible =
savedInstanceState.getBoolean("reply_visible");
// Show both the header and the message views. If isVisible is
// false or missing from the bundle, use the default layout.
if (isVisible) {
mReplyHeadTextView.setVisibility(View.VISIBLE);
mReplyTextView.setText(savedInstanceState
.getString("reply_text"));
mReplyTextView.setVisibility(View.VISIBLE);
}
}
}
โปรเจ็กต์ที่สมบูรณ์
โปรเจ็กต์ Android Studio: TwoActivitiesLifecycle
5. การเขียนโค้ด
ภารกิจ: สร้างแอปรายการช็อปปิ้งง่ายๆ ที่มีกิจกรรมหลักสำหรับรายการที่ผู้ใช้สร้าง และกิจกรรมที่ 2 สำหรับรายการสินค้าช็อปปิ้งทั่วไป
- กิจกรรมหลักควรมีรายการที่จะสร้าง ซึ่งควรประกอบด้วยองค์ประกอบ TextView ว่าง 10 รายการ
- ปุ่ม "เพิ่มสินค้า" ในกิจกรรมหลักจะเปิดกิจกรรมที่ 2 ซึ่งมีรายการสินค้าทั่วไปสำหรับการช็อปปิ้ง (ชีส ข้าว แอปเปิล ฯลฯ) ใช้องค์ประกอบ Button เพื่อแสดงรายการ
- การเลือกรายการจะนําผู้ใช้กลับไปยังกิจกรรมหลัก และอัปเดต TextView ที่ว่างเปล่าให้รวมรายการที่เลือก
ใช้ Intent เพื่อส่งข้อมูลจากกิจกรรมหนึ่งไปยังอีกกิจกรรมหนึ่ง ตรวจสอบว่าระบบบันทึกสถานะปัจจุบันของรายการช็อปปิ้งไว้เมื่อผู้ใช้หมุนอุปกรณ์
6. สรุป
- วงจรชีวิตของกิจกรรมคือชุดสถานะที่กิจกรรมจะย้ายข้อมูลไป โดยเริ่มตั้งแต่สร้างกิจกรรมครั้งแรกและสิ้นสุดเมื่อระบบ Android เรียกคืนทรัพยากรสําหรับกิจกรรมนั้น
- เมื่อผู้ใช้ไปยังกิจกรรมหนึ่งๆ จากอีกกิจกรรมหนึ่ง ทั้งภายในและภายนอกแอป กิจกรรมแต่ละรายการจะย้ายไปมาระหว่างสถานะต่างๆ ในวงจรของกิจกรรม
- แต่ละสถานะในวงจรชีวิตของ Activity มีเมธอดการเรียกคืนที่เกี่ยวข้องซึ่งคุณสามารถลบล้างได้ในคลาส Activity
- เมธอดเกี่ยวกับวงจร ได้แก่ onCreate(), onStart(), onPause(), onRestart(), onResume(), onStop(), onDestroy()
- การลบล้างเมธอดการเรียกกลับของวงจรช่วยให้คุณเพิ่มลักษณะการทำงานที่เกิดขึ้นเมื่อกิจกรรมเปลี่ยนเป็นสถานะนั้นได้
- คุณสามารถเพิ่มเมธอดการลบล้างโครงร่างลงในคลาสใน Android Studio โดยใช้ "โค้ด" > "ลบล้าง"
- การเปลี่ยนแปลงการกำหนดค่าอุปกรณ์ เช่น การหมุน จะทำให้กิจกรรมถูกทำลายและสร้างใหม่ราวกับว่าเพิ่งสร้างขึ้น
- ระบบจะเก็บสถานะกิจกรรมบางส่วนไว้เมื่อมีการกําหนดค่า ซึ่งรวมถึงค่าปัจจุบันขององค์ประกอบ EditText สำหรับข้อมูลอื่นๆ ทั้งหมด คุณต้องบันทึกข้อมูลดังกล่าวด้วยตนเองอย่างชัดเจน
- บันทึกสถานะอินสแตนซ์ของกิจกรรมในเมธอด onSaveInstanceState()
- ระบบจะจัดเก็บข้อมูลสถานะอินสแตนซ์เป็นคู่คีย์/ค่าธรรมดาใน Bundle ใช้เมธอด Bundle เพื่อใส่ข้อมูลลงใน Bundle และดึงข้อมูลออกจาก Bundle
- กู้คืนสถานะอินสแตนซ์ใน onCreate() ซึ่งเป็นวิธีที่แนะนำ หรือ onRestoreInstanceState() กลับ