การหยุด activity ชั่วคราว และ กลับมาทำงานต่อ

เขียนเมื่อ 9 ปีก่อน โดย Ninenik Narkdee
android activity lifecycle android studio activity pause activity resume

คำสั่ง การ กำหนด รูปแบบ ตัวอย่าง เทคนิค ลูกเล่น การประยุกต์ การใช้งาน เกี่ยวกับ android activity lifecycle android studio activity pause activity resume

ดูแล้ว 5,119 ครั้ง


ในขณะที่ app ถูกใช้งานตามปกติ จะมี activity ที่แสดงด้านหน้าสุด ซึ่งบางครั้งก็ถูกบดบัง
จากองค์ประกอบส่วนอื่น ทำให้ activity หยุดลงชั่วคราว ยกตัวอย่าง เช่น เมื่อ activity 
ที่มีลักษณะกิ่งโปรงใสเปิดขึ้นมา (เช่นรูปแบบสไตล์ dialog) activity ที่แสดงอยู่ก่อนหน้าจะหยุดลงชั่วคราว 
ตราบใดที่ activity ยังแสดงแค่บางส่วนแต่ไม่ใช่ activity หลักที่ถูกใช้งาน 
activity นั้นก็จะยังคงหยุดชั่วคราวอยู่
 
อย่างไรก็ตาม เมื่อ activity อันหนึ่งอันใดก็ตามถูกบดบังแบบเต็ม และไม่สามารถมองเห็นได้
activity นั้นก็จะหยุด (กรณีการหยุดทำงาน ของ activity ดูเพิ่มในตอนหน้า)
 
 
เมื่อ activity เข้ามาอยู่ใน Paused state ระบบจะเรียก onPause() method ซึ่งจะทำให้เราสามารถหยุด
การกระทำที่ทำงานต่อเนื่องนั้นไม่ให้ทำงานต่อได้ในขณะที่ถูกหยุดชั่วคราว (เช่น video) หรือสามารถบันทึก
ข้อมูลใดๆ ที่ยังคงอยู่จัดเก็บอย่างถาวรในกรณีที่ผู้ใช้ออกจาก app ไป 
ถ้าผู้ใช้กลับมาจาก Paused state ระบบจะกลับมาทำงานต่อและเรียกใช้ onResume() method
 
ข้อสังเกต:: ในกรณีที่ activity เรียกใช้งาน method onPause() อาจจะบอกได้ว่า activity นั้นจะถูกหยุด
ชั่วขณะและผู้ใช้อาจกลับมาใช้งาน activity ต่อ อย่างไรก็ตาม โดยปกติสิ่งแรกที่บ่งชีนั้นก็คือผู้ใช้กำลังออกจาก
activity 
 

 
จากรูป เมื่อ activity กึ่งโปรงใส บดบัง activity ของเรา ระบบก็จะเรียก onPause() method และ activity เลื่อนลงมา
อยู่ที่ Paused state (หมายเลข 1) ถ้าผู้ใช้กลับไปยัง activity ในขณะที่ยังหยุดชั่วคราวอยู่ ระบบก็จะไปเรียก
onResume() method (หมายเลข 2)


 
 
 
การหยุด activity ชั่วคราว 
 
เมื่อระบบเรียกใช้งาน onPause() method ใน activity ในทางเทคนิคหมายความว่า activity จะยังคงแสดงบาง
ส่วนอยู่ แต่บ่อยครั้งก็จะเห็นว่าผู้ใช้ได้ออกจาก activity ไปแล้ว  และในไม่ช้าก็จะเข้าสู่ Stopped state 
ดังนั้นโดยปกติแล้วเราควรใช้งาน onPause() เพื่อ

    1. หยุดการเคลื่อนไหว animation หรือ การทำงานที่ต่อเนื่องที่จะไปเพิ่มภาระการทำงานให้กับ CPU

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

    3. คืนทรัพยากรของระบบ เช่นการรับการถ่ายทอด, การจัดการกับเซนเซอร์ (อย่าง GPS) หรือทรัพยากร
        ใดๆก็ตามที่มีผลต่ออายุการใช้งานของแบตเตอรี่ในขณะที่หยุดชั่วคราวและผู้ใช้ไม่จำเป็นต้องใช้งานแล้ว

 
ยกตัวอย่าง ถ้า app ของเรามีการใช้งานกล้องอยู่ และมีสายโทรเข้ามา เราควรกำหนดให้ยกเลิกการใช้กล้อง
เมื่อ onPause() method ถูกเรียกใช้งาน
 
@Override
public void onPause() {
    super.onPause();  // เรียกใช้งาน superclass ก่อนทุกครั้งเสมอ  

    // ปิดการใช้งานกล้อง กรณีที่ไม่จำเป็นต้องใช้แล้ว
    // และ activity อื่นอาจจำเป็นต้องใช้กล้อง
    if (mCamera != null) {
        mCamera.release()
        mCamera = null;
    }
}
 
 
โดยทั่วไป เราไม่ควรจะใช้ onPause() เพื่อทำการบันทึกการเปลี่ยนแปลงของผู้ใช้ (เช่นข้อมูลส่วนตัว ที่อยู่ใน form)
ลงในที่จัดเก็บอย่างถาวร เวลาเดียวที่เราควรจะบันทึกการเปลี่ยนแปลงของผู้ใช้ที่ยังคงอยู่อย่างถาวรภายใน onPause()
method ก็คือเมื่อเรามั่นใจแน่นอนว่าผู้ใช้หวังให้การเปลี่ยนแปลงนั้นๆ ถูกบันทึกอัตโนมัติ (อย่างจดหมายร่างอีเมล)
อย่างไรก็ตาม เราควรหลีกเลี่ยงการใช้งาน CPU อย่างหนักในระหว่างเรียกใช้ onPause() เช่นการเขียนข้อมูลลงฐานข้อมูล
เพราะว่า อาจจะส่งผลให้การเปลี่ยนไป activity ถัดไปทำงานช้าลง (เราควรกำหนดการทำงานหนักๆ ในสวนของ onStop() แทน)
 
เราควรจะกำหนดจำนวนของการดำเนินการใน onPause() method ให้สัมพันธ์อย่างง่ายกับการใช้งาน ทั้งนี้ก็เพื่อให้
การเปลี่ยน activity ไปยัง activity ถัดไป ทำงานได้เร็วขึ้น ถ้า activity ที่ใช้งานกำลังจะหยุด
 
 
ข้อสังเกต:: เมื่อ activity ถูกหยุดชั่วคราว activity instance จะยังถูกเก็บอยู่ภายในหน่วยความจำ และจะถูกเรียกใช้เมื่อ
activity กลับมาทำงานต่อ  เราไม่จำเป็นจะต้องกำหนดค่าเริ่มต้นใดที่เคยได้ถูกกำหนดมาแล้วในแต่ละ callback method
ที่กำลังกลับขั้นไปที่ตำแหน่ง Resumed state อีก



 
 
การกลับมาทำงานต่อของ Activity
 
เมื่อผู้ใช้กลับมาใช้งาน activity จาก Paused state ระบบจะเรียกใช้งาน onResume() method
 
โปรดระวังว่า ระบบจะเรียก method นี้ทุกๆ ครั้งที่ activity กลับมาแสดงด้านหน้าสุด รวมไปถึงกรณีที่ถูกสร้างขึ้นครั้งแรก
ดังนั้น เราควนจะใช้ onResume() เพื่อกำหนด ส่วนประกอบเริ่มต้น ที่เรายกเลิกหรือปิดไปในขณะเรียกใช้งาน onPause()
ด้วย และแสดงค่าเริ่มต้นอื่นที่ต้องเกิดขึ้นทุกครั้งที่ activity เข้าสู่ Resumed state (อย่างเช่น การเริ่มการเคลื่อนไหว และ
องค์ประกอบตั้งต้นอื่นๆ ที่ใช้เมื่อ activity ถูกใช้งานอยู่)
 
ตัวอย่างด้านล่าง เกี่ยวกับ onResume() จะคล้ายกับที่ใช้ใน onPause() ตามตัวอย่างด้านบน
ดังนั้น ส่วนนี้ก็คือ การกำหนดค่าเริ่มต้นให้กับกล้องให้สามารถใช้งานได้ หลังจากถูกปิดการใช้งาน
ตอนที่ activity หยุดชั่วคราว 
 
@Override
public void onResume() {
    super.onResume();  //  เรียกใช้งาน superclass ก่อนทุกครั้งเสมอ  

    // ตรวจสอบว่าจะมีการเรียกใช้งานกล้องผ่าน instance ใน activity หรือไม่
    if (mCamera == null) { // ถ้าไม่มีหรือเป็นค่าว่าง
        initializeCamera(); // จัดการการเรียกใช้งานกล้อง เริ่มต้น
    }
}
 


กด Like หรือ Share เป็นกำลังใจ ให้มีบทความใหม่ๆ เรื่อยๆ น่ะครับ



อ่านต่อที่บทความ









เนื้อหาที่เกี่ยวข้อง









URL สำหรับอ้างอิง





คำแนะนำ และการใช้งาน

สมาชิก กรุณา ล็อกอินเข้าระบบ เพื่อตั้งคำถามใหม่ หรือ ตอบคำถาม สมาชิกใหม่ สมัครสมาชิกได้ที่ สมัครสมาชิก


  • ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ
  • เปลี่ยน


    ( หรือ เข้าใช้งานผ่าน Social Login )







เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ