วิธีใช้วงจรและสถานะของกิจกรรม

1. ยินดีต้อนรับ

Codelab ที่นำไปปฏิบัติได้จริงนี้เป็นส่วนหนึ่งของหน่วยที่ 1: เริ่มต้นใช้งานในหลักสูตรพื้นฐานนักพัฒนาแอป Android (เวอร์ชัน 2) คุณจะได้รับประโยชน์สูงสุดจากหลักสูตรนี้หากทำงานผ่าน Codelab ตามลำดับ

  • ดูรายการ Codelab ทั้งหมดในหลักสูตรที่ Codelab สำหรับพื้นฐานนักพัฒนาแอป Android (V2)
  • สำหรับรายละเอียดเกี่ยวกับหลักสูตร รวมถึงลิงก์ไปยังบท แอป และสไลด์ทั้งหมดของแนวคิด โปรดดูพื้นฐานสำหรับนักพัฒนาซอฟต์แวร์ Android (เวอร์ชัน 2)

เกริ่นนำ

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

ปัญหาแบบ Double

แต่ละระยะในวงจรของกิจกรรมจะมีเมธอดโค้ดเรียกกลับที่เกี่ยวข้อง: 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 ติดตั้งใช้งานโค้ดเรียกกลับในกิจกรรมหลัก

  1. เปิดโปรเจ็กต์ TwoActivity ใน Android Studio แล้วเปิด MainActivity ในแผงโปรเจ็กต์ > Android
  2. ในเมธอด onCreate() ให้เพิ่มคำสั่งบันทึกต่อไปนี้
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "onCreate");
  1. เพิ่มการลบล้างสำหรับโค้ดเรียกกลับ onStart() โดยมีคำสั่งในบันทึกสำหรับเหตุการณ์นั้นดังนี้
@Override
public void onStart(){
    super.onStart();
    Log.d(LOG_TAG, "onStart");
}

สำหรับทางลัด ให้เลือกโค้ด > การลบล้างเมธอดใน Android Studio กล่องโต้ตอบจะปรากฏขึ้นพร้อมวิธีที่เป็นไปได้ทั้งหมดที่คุณลบล้างได้ในชั้นเรียน การเลือกวิธีเรียกกลับอย่างน้อย 1 วิธีจากรายการจะแทรกเทมเพลตที่สมบูรณ์สำหรับเมธอดเหล่านั้น รวมถึงการเรียกใช้ที่จำเป็นไปยัง Superclass

  1. ใช้เมธอด onStart() เป็นเทมเพลตเพื่อใช้ onPause(), onRestart(), onดำเนินการกับ(), onStop() และ onDestroy() ที่เรียกกลับของวงจร

วิธีเรียกกลับทั้งหมดมีลายเซ็นเหมือนกัน (ยกเว้นชื่อ) ถ้าคุณคัดลอกและวาง onStart() เพื่อสร้างวิธีการเรียกกลับอื่นๆ เหล่านี้ โปรดอย่าลืมอัปเดตเนื้อหาเพื่อเรียกใช้เมธอดที่ถูกต้องในคลาสขั้นสูง และเพื่อบันทึกเมธอดที่ถูกต้อง

  1. เรียกใช้แอป
  2. คลิกแท็บ Logcat ที่ด้านล่างของ Android Studio เพื่อแสดงแผง Logcat คุณควรเห็นข้อความบันทึก 3 รายการที่แสดงสถานะวงจร 3 สถานะที่กิจกรรมได้ดำเนินการแล้วเมื่อเริ่มต้น ดังนี้
D/MainActivity: -------
D/MainActivity: onCreate
D/MainActivity: onStart
D/MainActivity: onResume

1.3 ติดตั้งใช้งานการเรียกกลับสำหรับวงจรใน SecondActivity

เมื่อคุณได้นำเมธอดโค้ดเรียกกลับสำหรับวงจรมาใช้สำหรับ MainActivity แล้ว ให้ทำแบบเดียวกันนี้กับ SecondActivity

  1. เปิดกิจกรรมที่สอง
  2. เพิ่มค่าคงที่สำหรับตัวแปร LOG_TAG ที่ด้านบนสุดของคลาส ดังนี้
private static final String LOG_TAG = SecondActivity.class.getSimpleName();
  1. เพิ่มการเรียกกลับและคำสั่งบันทึกสำหรับวงจรลงในกิจกรรมที่ 2 (คุณคัดลอกและวางวิธีการเรียกกลับจาก MainActivity)
  2. เพิ่มคำสั่งบันทึกไปยังเมธอด ReturnResponse() ก่อนเมธอดเสร็จสิ้น() ดังนี้
Log.d(LOG_TAG, "End SecondActivity");

1.4 สังเกตบันทึกขณะที่แอปทำงาน**

  1. เรียกใช้แอป
  2. คลิกแท็บ Logcat ที่ด้านล่างของ Android Studio เพื่อแสดงแผง Logcat
  3. ป้อนกิจกรรมในช่องค้นหา Logcat ของ Android อาจยาวและรกตา เนื่องจากตัวแปร LOG_TAG ในแต่ละคลาสประกอบด้วยคำว่า MainActivity หรือ SecondActivity คำหลักนี้จึงทำให้คุณสามารถกรองบันทึกเพื่อดูเฉพาะสิ่งที่คุณสนใจเท่านั้น

ปัญหาแบบ Double

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

  • ใช้แอปตามปกติ (ส่งข้อความ ตอบกลับด้วยข้อความอื่น)
  • ใช้ปุ่มย้อนกลับเพื่อย้อนกลับจากกิจกรรมที่สองไปยังกิจกรรมหลัก
  • ใช้ลูกศรขึ้นในแถบแอปเพื่อย้อนกลับจากกิจกรรมที่ 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()

  1. เปิดกิจกรรมหลัก
  2. เพิ่มการติดตั้งใช้งาน Skeleton ของ onSaveInstanceState() นี้ลงในกิจกรรม หรือใช้รหัส > การลบล้าง เมธอดเพื่อแทรกการลบล้างโครงสร้าง
@Override
public void onSaveInstanceState(Bundle outState) {
          super.onSaveInstanceState(outState);
}
  1. ตรวจสอบเพื่อดูว่าส่วนหัวมองเห็นได้หรือไม่ และถ้าเป็นเช่นนั้น ให้ใส่สถานะการเปิดเผยลงในกลุ่มสถานะด้วยเมธอด pushBoolean() และคีย์ "reply_visible"
 if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
        outState.putBoolean("reply_visible", true);
    }

โปรดทราบว่าระบบจะทำเครื่องหมายส่วนหัวและข้อความการตอบกลับไว้จนกว่าจะมีการตอบกลับจากกิจกรรมที่ 2 ถ้าส่วนหัวมองเห็นได้ แสดงว่ามีข้อมูลการตอบกลับที่ต้องบันทึก โปรดทราบว่าเราสนใจเฉพาะสถานะการแสดงผลดังกล่าวเท่านั้น โดยไม่จำเป็นต้องบันทึกข้อความจริงในส่วนหัวเนื่องจากข้อความจะไม่มีการเปลี่ยนแปลง

  1. เพิ่มข้อความตอบกลับลงในชุดการตรวจสอบเดียวกันด้วย
outState.putString("reply_text",mReplyTextView.getText().toString());

หากส่วนหัวปรากฏ ก็สันนิษฐานได้ว่าข้อความตอบกลับนั้นมองเห็นได้ด้วย คุณไม่จำเป็นต้องทดสอบหรือบันทึกสถานะการมองเห็นปัจจุบันของข้อความตอบกลับ เฉพาะเนื้อหาจริงของข้อความเท่านั้นที่จะเข้าสู่กลุ่มสถานะที่มีคีย์ "reply_text"

คุณจะบันทึกสถานะของเฉพาะองค์ประกอบ "ดู" ที่อาจเปลี่ยนแปลงหลังจากสร้างกิจกรรม คุณสามารถสร้างองค์ประกอบ View อื่นๆ ในแอป (EditText, ปุ่ม) จากเลย์เอาต์เริ่มต้นได้ทุกเมื่อ

โปรดทราบว่าระบบจะบันทึกสถานะขององค์ประกอบ View บางอย่าง เช่น เนื้อหาของ EditText

2.2 กู้คืนสถานะอินสแตนซ์กิจกรรมใน onCreate()

เมื่อบันทึกสถานะอินสแตนซ์กิจกรรมแล้ว คุณจะต้องกู้คืนอินสแตนซ์เมื่อมีการสร้างกิจกรรมอีกครั้งด้วย คุณสามารถทำเช่นนี้ได้ใน onCreate() หรือโดยการใช้การเรียกกลับ onRestoreInstanceState() ซึ่งจะเรียกใช้หลังจาก onStart() หลังจากสร้างกิจกรรม

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

  1. ในเมธอด 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()

  1. ในการตรวจสอบดังกล่าว ให้นำระดับการเข้าถึงปัจจุบัน (จริงหรือเท็จ) ออกจาก Bundle ด้วยคีย์ "reply_visible"
if (savedInstanceState != null) {
    boolean isVisible = 
                     savedInstanceState.getBoolean("reply_visible");
}
  1. เพิ่มการทดสอบด้านล่างบรรทัดก่อนหน้าสำหรับตัวแปร isVisible
if (isVisible) {
}

หากมีคีย์ โปรดตอบกลับ_visible ในกลุ่มสถานะ (และ isVisible เป็นความจริง) คุณจะต้องคืนค่าสถานะ

  1. ภายในการทดสอบ is visible ให้ทำให้ส่วนหัวมองเห็นได้
mReplyHeadTextView.setVisibility(View.VISIBLE);
  1. รับข้อความตอบกลับจาก Bundle ด้วยคีย์ "reply_text" และตั้งค่าให้ TextView ตอบกลับแสดงสตริงนั้น
mReplyTextView.setText(savedInstanceState.getString("reply_text"));
  1. ทำให้ TextView การตอบมองเห็นได้ด้วย
mReplyTextView.setVisibility(View.VISIBLE);
  1. เรียกใช้แอป ลองหมุนอุปกรณ์หรือโปรแกรมจำลองเพื่อให้แน่ใจว่าข้อความตอบกลับ (หากมี) ยังคงอยู่บนหน้าจอหลังจากสร้างกิจกรรมใหม่

โค้ดโซลูชันของงาน 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() กลับ