1. ยินดีต้อนรับ
Codelab ที่นำไปปฏิบัติได้จริงนี้เป็นส่วนหนึ่งของหน่วยที่ 1: เริ่มต้นใช้งานในหลักสูตรพื้นฐานนักพัฒนาแอป Android (เวอร์ชัน 2) คุณจะได้รับประโยชน์สูงสุดจากหลักสูตรนี้หากทำงานผ่าน Codelab ตามลำดับ
- ดูรายการ Codelab ทั้งหมดในหลักสูตรที่ Codelab สำหรับพื้นฐานนักพัฒนาแอป Android (V2)
- สำหรับรายละเอียดเกี่ยวกับหลักสูตร รวมถึงลิงก์ไปยังบท แอป และสไลด์ทั้งหมดของแนวคิด โปรดดูพื้นฐานสำหรับนักพัฒนาซอฟต์แวร์ Android (เวอร์ชัน 2)
เกริ่นนำ
ในทางปฏิบัตินี้ คุณจะได้ทราบข้อมูลเพิ่มเติมเกี่ยวกับวงจรกิจกรรม วงจรคือชุดของสถานะที่กิจกรรมหนึ่งๆ อาจอยู่ตลอดอายุการใช้งาน ตั้งแต่เวลาสร้างไปจนถึงเมื่อถูกทำลาย และระบบจะเรียกคืนทรัพยากร เมื่อผู้ใช้ไปยังส่วนต่างๆ ของกิจกรรมในแอป (รวมถึงเข้าและออกจากแอป) กิจกรรมจะเปลี่ยนไปมาระหว่างสถานะต่างๆ ในวงจร
แต่ละระยะในวงจรของกิจกรรมจะมีเมธอดโค้ดเรียกกลับที่เกี่ยวข้อง: onCreate(), onStart(), onPause() และอื่นๆ เมื่อกิจกรรมเปลี่ยนสถานะ ระบบจะเรียกใช้เมธอดโค้ดเรียกกลับที่เชื่อมโยง คุณเคยเห็นวิธีการใดวิธีการหนึ่งต่อไปนี้แล้ว onCreate() การลบล้างวิธีการเรียกกลับสำหรับวงจรในคลาสกิจกรรมช่วยให้คุณเปลี่ยนพฤติกรรมเริ่มต้นของกิจกรรมเพื่อตอบสนองต่อการดำเนินการของผู้ใช้หรือระบบได้
สถานะกิจกรรมยังอาจเปลี่ยนแปลงตามการเปลี่ยนแปลงการกำหนดค่าอุปกรณ์ด้วย เช่น เมื่อผู้ใช้หมุนอุปกรณ์จากแนวตั้งเป็นแนวนอน เมื่อมีการเปลี่ยนแปลงการกำหนดค่าเหล่านี้ ระบบจะทำลายและสร้างใหม่ในสถานะเริ่มต้น และผู้ใช้อาจสูญเสียข้อมูลที่ป้อนไว้ในกิจกรรม เพื่อไม่ให้ผู้ใช้เกิดความสับสน สิ่งสำคัญคือคุณต้องพัฒนาแอปเพื่อป้องกันข้อมูลสูญหายโดยไม่คาดคิด ในทางปฏิบัตินี้ คุณจะได้ทดลองกับการเปลี่ยนแปลงการกำหนดค่าและเรียนรู้วิธีรักษาสถานะของกิจกรรมไว้เพื่อตอบสนองต่อการเปลี่ยนแปลงการกำหนดค่าอุปกรณ์และเหตุการณ์ในวงจรกิจกรรมอื่นๆ
ในทางปฏิบัตินี้ คุณเพิ่มข้อความการบันทึกลงในแอป TwoActivity และสังเกตการเปลี่ยนแปลงวงจรกิจกรรมขณะที่คุณใช้แอป จากนั้นคุณจะเริ่มทำงานกับการเปลี่ยนแปลงเหล่านี้และศึกษาวิธีจัดการข้อมูลจากผู้ใช้ภายใต้เงื่อนไขเหล่านี้
ข้อกำหนดเบื้องต้น
คุณควรที่จะดำเนินการดังต่อไปนี้ได้
- สร้างและเรียกใช้โปรเจ็กต์แอปใน Android Studio
- เพิ่มคำสั่งบันทึกลงในแอปและดูบันทึกเหล่านั้นในแผง Logcat
- ทำความเข้าใจและทำงานกับกิจกรรมและความตั้งใจ รวมถึงทำการโต้ตอบกับกิจกรรมเหล่านั้นได้อย่างสบายใจ
สิ่งที่คุณจะได้เรียนรู้
- วิธีการทำงานของวงจรกิจกรรม
- เมื่อกิจกรรมเริ่มต้น หยุดชั่วคราว หยุด และถูกทำลาย
- เกี่ยวกับวิธีเรียกกลับสำหรับวงจรที่เชื่อมโยงกับการเปลี่ยนแปลงกิจกรรม
- ผลกระทบของการดำเนินการ (เช่น การเปลี่ยนแปลงการกำหนดค่า) ที่อาจทำให้เกิดเหตุการณ์ในวงจรกิจกรรม
- วิธีเก็บรักษาสถานะกิจกรรมไว้ในเหตุการณ์ในวงจร
สิ่งที่คุณจะต้องทำ
- เพิ่มโค้ดลงในแอป TwoActivities จากเวอร์ชันที่ใช้งานจริงก่อนหน้านี้ เพื่อใช้โค้ดเรียกกลับของวงจรกิจกรรมแบบต่างๆ เพื่อใส่คำสั่งการบันทึก
- สังเกตการเปลี่ยนแปลงสถานะขณะที่แอปทำงานและเมื่อคุณโต้ตอบกับแต่ละกิจกรรมในแอป
- แก้ไขแอปให้คงสถานะอินสแตนซ์ของกิจกรรมที่สร้างขึ้นใหม่โดยไม่คาดคิดเพื่อตอบสนองต่อพฤติกรรมของผู้ใช้หรือการเปลี่ยนแปลงการกำหนดค่าในอุปกรณ์
2. ภาพรวมของแอป
ในทางปฏิบัตินี้ คุณเพิ่มไปยังแอป TwoActivities แอปมีหน้าตาและทำงานเหมือนกับใน Codelab ล่าสุด บัญชีนี้มีการติดตั้งใช้งานกิจกรรม 2 แบบและให้ผู้ใช้ส่งระหว่างการตั้งค่าต่างๆ ได้ การเปลี่ยนแปลงที่คุณทำกับแอปในทางปฏิบัตินี้จะไม่ส่งผลต่อพฤติกรรมของผู้ใช้ที่มองเห็นได้
3. 3. งานที่ 1: เพิ่มการเรียกกลับสำหรับวงจรใน TwoActivity
ในงานนี้ คุณจะได้ใช้วิธีการเรียกกลับสำหรับวงจรกิจกรรมทั้งหมดเพื่อพิมพ์ข้อความไปยัง Logcat เมื่อมีการเรียกใช้เมธอดเหล่านั้น ข้อความบันทึกเหล่านี้จะช่วยให้คุณดูได้ว่าวงจรกิจกรรมมีการเปลี่ยนแปลงสถานะเมื่อใด และการเปลี่ยนแปลงสถานะของวงจรเหล่านั้นส่งผลต่อแอปในขณะที่ทำงานอย่างไร
1.1 (ไม่บังคับ) คัดลอกโครงการ TwoActivity
สำหรับงานในเชิงปฏิบัตินี้ คุณจะได้แก้ไขโปรเจ็กต์ TwoActivities ที่มีอยู่จริงซึ่งคุณสร้างขึ้นในภาคปฏิบัติล่าสุด หากต้องการเก็บโปรเจ็กต์ TwoActivity ก่อนหน้านี้ ให้ทำตามขั้นตอนในภาคผนวก: ยูทิลิตี เพื่อทำสำเนาโปรเจ็กต์
1.2 ติดตั้งใช้งานโค้ดเรียกกลับในกิจกรรมหลัก
- เปิดโปรเจ็กต์ TwoActivity ใน 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 วิธีจากรายการจะแทรกเทมเพลตที่สมบูรณ์สำหรับเมธอดเหล่านั้น รวมถึงการเรียกใช้ที่จำเป็นไปยัง Superclass
- ใช้เมธอด onStart() เป็นเทมเพลตเพื่อใช้ onPause(), onRestart(), onดำเนินการกับ(), onStop() และ onDestroy() ที่เรียกกลับของวงจร
วิธีเรียกกลับทั้งหมดมีลายเซ็นเหมือนกัน (ยกเว้นชื่อ) ถ้าคุณคัดลอกและวาง onStart() เพื่อสร้างวิธีการเรียกกลับอื่นๆ เหล่านี้ โปรดอย่าลืมอัปเดตเนื้อหาเพื่อเรียกใช้เมธอดที่ถูกต้องในคลาสขั้นสูง และเพื่อบันทึกเมธอดที่ถูกต้อง
- เรียกใช้แอป
- คลิกแท็บ Logcat ที่ด้านล่างของ Android Studio เพื่อแสดงแผง Logcat คุณควรเห็นข้อความบันทึก 3 รายการที่แสดงสถานะวงจร 3 สถานะที่กิจกรรมได้ดำเนินการแล้วเมื่อเริ่มต้น ดังนี้
D/MainActivity: -------
D/MainActivity: onCreate
D/MainActivity: onStart
D/MainActivity: onResume
1.3 ติดตั้งใช้งานการเรียกกลับสำหรับวงจรใน SecondActivity
เมื่อคุณได้นำเมธอดโค้ดเรียกกลับสำหรับวงจรมาใช้สำหรับ MainActivity แล้ว ให้ทำแบบเดียวกันนี้กับ SecondActivity
- เปิดกิจกรรมที่สอง
- เพิ่มค่าคงที่สำหรับตัวแปร LOG_TAG ที่ด้านบนสุดของคลาส ดังนี้
private static final String LOG_TAG = SecondActivity.class.getSimpleName();
- เพิ่มการเรียกกลับและคำสั่งบันทึกสำหรับวงจรลงในกิจกรรมที่ 2 (คุณคัดลอกและวางวิธีการเรียกกลับจาก MainActivity)
- เพิ่มคำสั่งบันทึกไปยังเมธอด ReturnResponse() ก่อนเมธอดเสร็จสิ้น() ดังนี้
Log.d(LOG_TAG, "End SecondActivity");
1.4 สังเกตบันทึกขณะที่แอปทำงาน**
- เรียกใช้แอป
- คลิกแท็บ Logcat ที่ด้านล่างของ Android Studio เพื่อแสดงแผง Logcat
- ป้อนกิจกรรมในช่องค้นหา Logcat ของ Android อาจยาวและรกตา เนื่องจากตัวแปร LOG_TAG ในแต่ละคลาสประกอบด้วยคำว่า MainActivity หรือ SecondActivity คำหลักนี้จึงทำให้คุณสามารถกรองบันทึกเพื่อดูเฉพาะสิ่งที่คุณสนใจเท่านั้น
ทดสอบโดยใช้แอปและสังเกตเหตุการณ์ในวงจรที่เกิดขึ้นตามการดำเนินการที่ต่างกัน โดยเฉพาะอย่างยิ่ง ให้ลองใช้สิ่งต่อไปนี้
- ใช้แอปตามปกติ (ส่งข้อความ ตอบกลับด้วยข้อความอื่น)
- ใช้ปุ่มย้อนกลับเพื่อย้อนกลับจากกิจกรรมที่สองไปยังกิจกรรมหลัก
- ใช้ลูกศรขึ้นในแถบแอปเพื่อย้อนกลับจากกิจกรรมที่ 2 ไปยังกิจกรรมหลัก
- หมุนอุปกรณ์ทั้งในกิจกรรมหลักและกิจกรรมที่ 2 ในเวลาที่ต่างกันในแอปของคุณ และสังเกตสิ่งที่เกิดขึ้นใน * บันทึก และบนหน้าจอ
- กดปุ่มภาพรวม (ปุ่มสี่เหลี่ยมจัตุรัสทางด้านขวาของหน้าแรก) และปิดแอป (แตะ X)
- กลับไปที่หน้าจอหลักแล้วรีสตาร์ทแอป
เคล็ดลับ: หากคุณใช้แอปในโปรแกรมจำลอง คุณสามารถจำลองการหมุนด้วย Control+F11 หรือ Control+Function+F11
โค้ดโซลูชันของงาน 1
ข้อมูลโค้ดต่อไปนี้แสดงโค้ดโซลูชันสำหรับงานแรก
MainActivity
ข้อมูลโค้ดต่อไปนี้จะแสดงโค้ดที่เพิ่มใน 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();
เมธอด ReturnResponse():
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();
}
วิธีการสำหรับวงจรอื่นๆ ได้แก่
เหมือนกับกิจกรรมหลักด้านบน
4. 4. งาน 2: บันทึกและคืนค่าสถานะอินสแตนซ์กิจกรรม
กิจกรรมแต่ละรายการในแอปของคุณอาจถูกทำลายและสร้างใหม่บ่อยกว่าที่คุณคิด ทั้งนี้ขึ้นอยู่กับทรัพยากรของระบบและพฤติกรรมของผู้ใช้
คุณอาจสังเกตเห็นลักษณะการทำงานนี้ในส่วนสุดท้ายเมื่อหมุนอุปกรณ์หรือโปรแกรมจำลอง การหมุนอุปกรณ์เป็นตัวอย่างหนึ่งของการเปลี่ยนแปลงการกำหนดค่าอุปกรณ์ แม้ว่าการหมุนเวียนจะเป็นวิธีที่ใช้กันมากที่สุด แต่การเปลี่ยนแปลงการกำหนดค่าทั้งหมดจะทำให้กิจกรรมปัจจุบันถูกทำลายและสร้างขึ้นใหม่ราวกับว่าเป็นกิจกรรมใหม่ หากคุณไม่พิจารณาพฤติกรรมนี้ในโค้ดของคุณ เมื่อเกิดการเปลี่ยนแปลงการกำหนดค่า เลย์เอาต์กิจกรรมอาจเปลี่ยนกลับไปเป็นรูปลักษณ์เริ่มต้นและค่าเริ่มต้น และผู้ใช้ของคุณอาจสูญเสียตำแหน่ง ข้อมูลของผู้ใช้ หรือสถานะความคืบหน้าในแอปไป
สถานะของแต่ละกิจกรรมจะจัดเก็บเป็นชุดคู่คีย์/ค่าในออบเจ็กต์ Bundle ที่เรียกว่าสถานะอินสแตนซ์กิจกรรม ระบบจะบันทึกข้อมูลสถานะเริ่มต้นลงในแพ็กเกจสถานะอินสแตนซ์ก่อนที่กิจกรรมจะหยุดทำงาน และส่งต่อ Bundle นั้นไปยังอินสแตนซ์กิจกรรมใหม่เพื่อกู้คืน
เพื่อป้องกันการสูญเสียข้อมูลในกิจกรรมเมื่อมีการทำลายและสร้างใหม่โดยไม่คาดคิด คุณต้องใช้เมธอด onSaveInstanceState() ระบบจะเรียกเมธอดนี้ในกิจกรรมของคุณ (ระหว่าง onPause() และ onStop()) เมื่อมีความเป็นไปได้ว่ากิจกรรมอาจถูกทำลายและสร้างใหม่
ข้อมูลที่คุณบันทึกไว้ในสถานะอินสแตนซ์จะเฉพาะเจาะจงสำหรับอินสแตนซ์นี้ของกิจกรรมที่เฉพาะเจาะจงนี้เท่านั้นในระหว่างเซสชันของแอปปัจจุบัน เมื่อคุณหยุดและรีสตาร์ทเซสชันแอปใหม่ สถานะอินสแตนซ์กิจกรรมจะหายไป และกิจกรรมจะเปลี่ยนกลับไปเป็นลักษณะที่ปรากฏเริ่มต้น หากต้องการบันทึกข้อมูลผู้ใช้ระหว่างเซสชันของแอป ให้ใช้ค่ากำหนดหรือฐานข้อมูลที่ใช้ร่วมกัน คุณได้เรียนรู้เกี่ยวกับทั้ง 2 สิ่งนี้ในทางปฏิบัติในภายหลัง
2.1 บันทึกสถานะอินสแตนซ์กิจกรรมด้วย onSaveInstanceState()
คุณอาจสังเกตเห็นว่าการหมุนอุปกรณ์ไม่มีผลต่อสถานะของกิจกรรมที่ 2 เลย เนื่องจากเลย์เอาต์และสถานะกิจกรรมที่ 2 จะสร้างขึ้นจากเลย์เอาต์และ Intent ที่เปิดใช้งาน แม้ว่าจะสร้างกิจกรรมอีกครั้ง แต่ Intent จะยังคงอยู่และข้อมูลใน Intent นั้นจะยังคงมีอยู่ทุกครั้งที่มีการเรียกใช้เมธอด onCreate() ในกิจกรรมที่สอง
นอกจากนี้ คุณอาจสังเกตเห็นว่าในแต่ละกิจกรรม ข้อความใดๆ ที่คุณพิมพ์ลงในข้อความหรือองค์ประกอบ EditText ตอบกลับจะยังคงอยู่แม้ว่าอุปกรณ์จะหมุนตัวอยู่ก็ตาม นั่นเป็นเพราะว่าข้อมูลสถานะขององค์ประกอบมุมมองบางรายการในเลย์เอาต์จะได้รับการบันทึกโดยอัตโนมัติในการเปลี่ยนแปลงการกำหนดค่า และในกรณีเหล่านี้ ค่าปัจจุบันของ EditText
ดังนั้นสถานะ "กิจกรรม" เพียงประเภทเดียวที่คุณสนใจคือองค์ประกอบ TextView สำหรับส่วนหัวการตอบกลับและข้อความตอบกลับในกิจกรรมหลัก องค์ประกอบ TextView ทั้ง 2 องค์ประกอบจะไม่ปรากฏโดยค่าเริ่มต้น แต่จะปรากฏเมื่อคุณส่งข้อความกลับไปยังกิจกรรมหลักจากกิจกรรมที่สองเท่านั้น
ในงานนี้ คุณจะได้เพิ่มโค้ดเพื่อรักษาสถานะอินสแตนซ์ขององค์ประกอบ TextView 2 รายการเหล่านี้โดยใช้ onSaveInstanceState()
- เปิดกิจกรรมหลัก
- เพิ่มการติดตั้งใช้งาน Skeleton ของ onSaveInstanceState() นี้ลงในกิจกรรม หรือใช้รหัส > การลบล้าง เมธอดเพื่อแทรกการลบล้างโครงสร้าง
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
- ตรวจสอบเพื่อดูว่าส่วนหัวมองเห็นได้หรือไม่ และถ้าเป็นเช่นนั้น ให้ใส่สถานะการเปิดเผยลงในกลุ่มสถานะด้วยเมธอด pushBoolean() และคีย์ "reply_visible"
if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
outState.putBoolean("reply_visible", true);
}
โปรดทราบว่าระบบจะทำเครื่องหมายส่วนหัวและข้อความการตอบกลับไว้จนกว่าจะมีการตอบกลับจากกิจกรรมที่ 2 ถ้าส่วนหัวมองเห็นได้ แสดงว่ามีข้อมูลการตอบกลับที่ต้องบันทึก โปรดทราบว่าเราสนใจเฉพาะสถานะการแสดงผลดังกล่าวเท่านั้น โดยไม่จำเป็นต้องบันทึกข้อความจริงในส่วนหัวเนื่องจากข้อความจะไม่มีการเปลี่ยนแปลง
- เพิ่มข้อความตอบกลับลงในชุดการตรวจสอบเดียวกันด้วย
outState.putString("reply_text",mReplyTextView.getText().toString());
หากส่วนหัวปรากฏ ก็สันนิษฐานได้ว่าข้อความตอบกลับนั้นมองเห็นได้ด้วย คุณไม่จำเป็นต้องทดสอบหรือบันทึกสถานะการมองเห็นปัจจุบันของข้อความตอบกลับ เฉพาะเนื้อหาจริงของข้อความเท่านั้นที่จะเข้าสู่กลุ่มสถานะที่มีคีย์ "reply_text"
คุณจะบันทึกสถานะของเฉพาะองค์ประกอบ "ดู" ที่อาจเปลี่ยนแปลงหลังจากสร้างกิจกรรม คุณสามารถสร้างองค์ประกอบ View อื่นๆ ในแอป (EditText, ปุ่ม) จากเลย์เอาต์เริ่มต้นได้ทุกเมื่อ
โปรดทราบว่าระบบจะบันทึกสถานะขององค์ประกอบ View บางอย่าง เช่น เนื้อหาของ EditText
2.2 กู้คืนสถานะอินสแตนซ์กิจกรรมใน onCreate()
เมื่อบันทึกสถานะอินสแตนซ์กิจกรรมแล้ว คุณจะต้องกู้คืนอินสแตนซ์เมื่อมีการสร้างกิจกรรมอีกครั้งด้วย คุณสามารถทำเช่นนี้ได้ใน onCreate() หรือโดยการใช้การเรียกกลับ onRestoreInstanceState() ซึ่งจะเรียกใช้หลังจาก onStart() หลังจากสร้างกิจกรรม
ส่วนใหญ่แล้ว ตำแหน่งที่ดีที่สุดในการคืนค่าสถานะกิจกรรมคือ onCreate() เพื่อให้ UI รวมถึงสถานะพร้อมใช้งานโดยเร็วที่สุด บางครั้งการดำเนินการใน onRestoreInstanceState() เป็นวิธีที่สะดวกหลังจากดำเนินการเริ่มต้นทั้งหมดแล้ว หรืออนุญาตให้คลาสย่อยตัดสินใจว่าจะใช้การติดตั้งใช้งานเริ่มต้นหรือไม่
- ในเมธอด onCreate() หลังจากที่ตัวแปร View เริ่มต้นด้วย findViewById() ให้เพิ่มการทดสอบเพื่อให้แน่ใจว่า recordInstanceState ไม่เป็นค่าว่าง
// 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) {
}
เมื่อสร้างกิจกรรมแล้ว ระบบจะส่งแพ็กเกจสถานะไปยัง onCreate() เป็นอาร์กิวเมนต์เดียว ครั้งแรกที่มีการเรียก onCreate() และแอปของคุณเริ่มทำงาน แพ็กเกจจะเป็น Null โดยไม่มีสถานะใดๆ เมื่อแอปเริ่มทำงานเป็นครั้งแรก การเรียกใช้ onCreate() ในภายหลังจะมีชุดข้อมูลที่ประกอบด้วยข้อมูลที่คุณเก็บไว้ใน onSaveInstanceState()
- ในการตรวจสอบดังกล่าว ให้นำระดับการเข้าถึงปัจจุบัน (จริงหรือเท็จ) ออกจาก Bundle ด้วยคีย์ "reply_visible"
if (savedInstanceState != null) {
boolean isVisible =
savedInstanceState.getBoolean("reply_visible");
}
- เพิ่มการทดสอบด้านล่างบรรทัดก่อนหน้าสำหรับตัวแปร isVisible
if (isVisible) {
}
หากมีคีย์ โปรดตอบกลับ_visible ในกลุ่มสถานะ (และ isVisible เป็นความจริง) คุณจะต้องคืนค่าสถานะ
- ภายในการทดสอบ is visible ให้ทำให้ส่วนหัวมองเห็นได้
mReplyHeadTextView.setVisibility(View.VISIBLE);
- รับข้อความตอบกลับจาก Bundle ด้วยคีย์ "reply_text" และตั้งค่าให้ TextView ตอบกลับแสดงสตริงนั้น
mReplyTextView.setText(savedInstanceState.getString("reply_text"));
- ทำให้ TextView การตอบมองเห็นได้ด้วย
mReplyTextView.setVisibility(View.VISIBLE);
- เรียกใช้แอป ลองหมุนอุปกรณ์หรือโปรแกรมจำลองเพื่อให้แน่ใจว่าข้อความตอบกลับ (หากมี) ยังคงอยู่บนหน้าจอหลังจากสร้างกิจกรรมใหม่
โค้ดโซลูชันของงาน 2
ข้อมูลโค้ดต่อไปนี้จะแสดงโค้ดโซลูชันสำหรับงานนี้
MainActivity
ข้อมูลโค้ดต่อไปนี้จะแสดงโค้ดที่เพิ่มใน 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. การเขียนโค้ด
ภารกิจ: สร้างแอปรายการช็อปปิ้งแบบง่ายโดยมีกิจกรรมหลักสำหรับลิสต์ที่ผู้ใช้สร้าง และกิจกรรมที่สองสำหรับลิสต์ของซื้อของทั่วไป
- กิจกรรมหลักควรมีรายการที่จะสร้าง ซึ่งควรประกอบด้วยองค์ประกอบ TextView ที่ว่างเปล่า 10 องค์ประกอบ
- ปุ่มเพิ่มรายการในกิจกรรมหลักจะเปิดกิจกรรมที่ 2 ที่มีรายการรายการช็อปปิ้งทั่วไป (เช่น ชีส ข้าว แอปเปิ้ล และอื่นๆ) ใช้องค์ประกอบของปุ่มเพื่อแสดงรายการ
- การเลือกรายการจะนำผู้ใช้กลับไปยังกิจกรรมหลัก และอัปเดต TextView ที่ว่างเปล่าเพื่อรวมรายการที่เลือก
ใช้ Intent เพื่อส่งต่อข้อมูลจากกิจกรรมหนึ่งไปยังอีกกิจกรรมหนึ่ง ตรวจสอบว่าสถานะปัจจุบันของรายการช็อปปิ้งได้รับการบันทึกเมื่อผู้ใช้หมุนอุปกรณ์
6. สรุป
- วงจรกิจกรรม คือชุดของสถานะที่กิจกรรมย้ายข้อมูลไป โดยเริ่มต้นเมื่อสร้างขึ้นเป็นครั้งแรกและสิ้นสุดเมื่อระบบ Android เรียกคืนทรัพยากรสำหรับกิจกรรมนั้น
- เมื่อผู้ใช้ออกจากกิจกรรมหนึ่งไปยังอีกกิจกรรมหนึ่ง รวมถึงภายในและภายนอกแอป แต่ละกิจกรรมจะย้ายไปมาระหว่างสถานะต่างๆ ในวงจรกิจกรรม
- แต่ละสถานะในวงจรกิจกรรมจะมีวิธีการเรียกกลับที่เกี่ยวข้องซึ่งคุณลบล้างได้ในคลาสกิจกรรม
- เมธอดสำหรับวงจร ได้แก่ onCreate(), onStart(), onPause(), onRestart(), onดำเนินการกับ(), onStop(), onDestroy()
- การลบล้างเมธอดการเรียกกลับสำหรับวงจรจะช่วยให้คุณเพิ่มลักษณะการทํางานที่เกิดขึ้นเมื่อกิจกรรมเปลี่ยนเป็นสถานะนั้นได้
- คุณเพิ่มวิธีการลบล้างโครงสร้างไปยังชั้นเรียนใน Android Studio ได้โดยใช้โค้ด > ลบล้าง
- การเปลี่ยนแปลงการกำหนดค่าอุปกรณ์ เช่น การหมุน จะส่งผลให้กิจกรรมถูกทำลายและสร้างใหม่ราวกับว่าเป็นกิจกรรมใหม่
- ส่วนหนึ่งของสถานะกิจกรรมจะถูกเก็บไว้ในการเปลี่ยนแปลงการกำหนดค่า รวมถึงค่าปัจจุบันขององค์ประกอบ EditText สำหรับข้อมูลอื่นๆ ทั้งหมด คุณต้องบันทึกข้อมูลนั้นด้วยตนเองอย่างชัดแจ้ง
- บันทึกสถานะอินสแตนซ์ของกิจกรรมในเมธอด onSaveInstanceState()
- ข้อมูลสถานะอินสแตนซ์จะจัดเก็บเป็นคู่คีย์/ค่าแบบง่ายในแพ็กเกจ ใช้เมธอด Bundle เพื่อใส่ข้อมูลและเรียกคืนข้อมูลออกจาก Bundle
- กู้คืนสถานะอินสแตนซ์ใน onCreate() ซึ่งเป็นวิธีการที่ต้องการ หรือ onRestoreInstanceState() กลับ