Android State Changes - Process Recreation

System-initiated Process Death หรือ Process Recreation เป็นการทำงานอย่างหนึ่งบนแอนดรอยด์ที่ส่งผลต่อแอปไม่ต่างจาก Configuration Changes และเกิดขึ้นได้บ่อยกว่า จึงทำให้นักพัฒนาแอปบนแอนดรอยด์ควรเข้าใจการทำงานที่ว่านี้เพื่อให้แอปสามารถทำงานได้ถูกต้องและไม่เกิดปัญหาขึ้นในภายหลัง

System-initiated Process Death เป็นชื่อเรียกอย่างเป็นทางการ แต่เพื่อให้ผู้อ่านจำได้ง่ายและใช้คำที่สั้น ในบทความนี้ขอใช้คำว่า Process Recreation แทน

บทความในชุดเดียวกัน

Process Recreation คืออะไร?

Process ใน ณ​ คือนี้คือ Application Process ของแอปที่ซ่อนอยู่เบื้องหลังที่ถูกระบบแอนดรอยด์ Kill Process เพื่อคืน Memory (Memory Reclaim) เพราะแอปที่กำลังทำงานอยู่ในตอนนั้นมีการใช้ Memory มากจน Free Memory ในตอนนั้นไม่เพียงพอ

ผลจากการถูก Kill Process จะทำให้ Process ถูกทำลายหรือที่เรียกว่า Process Death

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

ซึ่ง Process Recreation เป็นเหตุการณ์ที่เกิดขึ้นได้เป็นปกติสำหรับการใช้งานอุปกรณ์แอนดรอยด์และไม่สามารถหลีกเลี่ยงได้ ต่อให้อุปกรณ์แอนดรอยด์เครื่องนั้นจะมี RAM มากแค่ไหนก็ตาม

อุปกรณ์แอนดรอยด์ที่มี RAM เยอะจะมีโอกาสเกิด Process Recreation ได้น้อยกว่าเครื่องที่มี RAM น้อย

และในระหว่างการ Kill Process นั้น ระบบแอนดรอยด์จะไม่ได้สั่งปิดแอปเพียงอย่างเดียว แต่จะมีบริการช่วยเก็บข้อมูลบางส่วนให้กับแอปนั้นด้วย เพื่อให้แอปสามารถกลับมาทำงานต่อจากเดิมได้ และนั่นก็คือที่มาของคำว่า Recreation นั่นเอง

สิ่งที่เกิดขึ้นกับแอปในระหว่าง Process Recreation

ถึงแม้ระบบแอนดรอยด์จะ Kill Process แอปที่ไม่ได้ทำงานอยู่ในขณะนั้นเพื่อคืน Memory แต่ในระหว่าง Process Recreation ก็จะมีรายละเอียดที่นักพัฒนาควรรู้ดังนี้

App State Saving & Restoring

ก่อนที่ระบบแอนดรอยด์จะ Kill Process ของแอปใด ๆ ก็ตาม จะเปิดโอกาสให้นักพัฒนาแอปนั้นเก็บข้อมูลบางส่วนไว้ที่ระบบแอนดรอยด์แบบชั่วคราวได้

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

Process ก่อนและหลัง Recreation เป็นคนละตัวกัน

ตอนที่ผู้ใช้กดเปิดแอปกลับขึ้นมาอีกครั้ง สิ่งที่ระบบแอนดรอยด์พยายามทำให้จะไม่ใช่การสร้าง Process เดิมกลับขึ้นมา แต่จะเปิดแอปใหม่บน Process ที่ถูกสร้างขึ้นมาใหม่ ซึ่งทำให้ข้อมูลที่เก็บไว้ใน Heap ใน Process ของแอปก่อนที่ Recreation จะถูกทำลายทิ้งไปพร้อมกับ Process ของแอป

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

นักพัฒนาสามารถตรวจสอบการเกิด Process Recreation กับแอปของตัวเอง โดยดูจาก Process ID จาก Log ที่เกิดขึ้นภายในแอปได้

Process Recreation ต่างจาก Configuration Changes ยังไง?

อาจจะดูเหมือนว่าสิ่งที่เกิดขึ้นกับ Process Recreation นั้นคล้ายกับ Configuration Changes แต่ทว่าขอบเขตในการ Recreation ของทั้ง 2 เหตุการณ์นั้นแตกต่างกันโดยสิ้นเชิง

เพราะ Configuration Changes จะเกิดขึ้นแค่ในระดับ Activity Level และเฉพาะ Visible Activity เท่านั้นที่จะถูก Recreate ส่วน Activity ตัวอื่นที่อยู่ใน Back Stack จะถูก Recreate ก็ต่อเมื่อกลับมาเป็น Visible Activity

ในขณะที่ Process Recreation จะเกิดขึ้นในระดับ Process Level จึงทำให้ Activity ทั้งหมดที่อยู่ใน Back Stack ถูก Recreate ไปพร้อมกันทั้งหมด

ระบบแอนดรอยด์เก็บข้อมูลในระหว่าง Process Death ไว้ให้นานแค่ไหน

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

ลองย่อแอป YouTube และสลับไปใช้แอปอื่น แล้วค่อยกลับมาเปิดแอป YouTube อีกครั้งหลังจากผ่านไป 2-3 วันถัดไปดูสิ

นักพัฒนาทำอะไรในระหว่าง Process Recreation ได้บ้าง

ในกรณีที่ภายในแอปมีการถือข้อมูลจำพวก App State แบบ In-memory ไว้และจำเป็นต่อการทำงานของแอป นักพัฒนาควรเก็บข้อมูลให้ถูกต้องในระหว่างที่เกิด Process Recreation โดยใช้วิธีที่เรียกว่า App State Saving & Restoring ซึ่งเป็นวิธีเดียวกับที่ต้องทำสำหรับ Configuration Changes นั่นเอง

ส่วนข้อมูลที่เก็บไว้ใน Persistence Storage อยู่แล้ว ไม่ต้องทำอะไร

วิธีทดสอบ Process Recreation ในแอปของตัวเอง

นักพัฒนาสามารถจำลองการเกิด Process Recreation เพื่อทดสอบการทำงานของแอปได้ด้วยการย่อแอปบนอุปกรณ์แอนดรอยด์แล้วคลิกขวาที่ Log ของแอปเราใน Logcat บน Android Studio แล้วเลือก Kill Process

และเมื่อเปิดแอปขึ้นมาอีกครั้ง แอปก็จะเข้าสู่ขั้นตอนของ Process Recreation ให้ทันที

สรุป

System-initiated Process Death หรือ Process Recreation เป็นการทำงานที่มีเฉพาะบนระบบปฏิบัติการณ์แอนดรอยด์เท่านั้น และเป็นส่วนหนึ่งที่ทำให้ผลลัพธ์จากการย่อแอปหรือสลับไปใช้งานแอปอื่นนั้นแตกต่างจากระบบปฏิบัติการณ์อื่น ๆ ที่มักจะใช้วิธีปิดแอปทิ้งไปเลยเมื่อต้องการคืน Memory และเพื่อให้ผู้ใช้สามารถใช้งานแอปต่าง ๆ ภายในเครื่องได้อย่างต่อเนื่อง ทีมพัฒนาแอนดรอยด์จึงออกแบบการทำงานนี้ขึ้นมา และก็เป็นสิ่งที่นักพัฒนาควรเข้าใจและให้ความสำคัญ

ดังนั้นนักพัฒนาควรเข้าใจการทำงานของ Process Recreation บนแอนดรอยด์ว่าส่งผลต่อแอปยังไง และมีวิธีจัดการกับข้อมูลภายในแอปอย่างไรให้เหมาะสม ซึ่งทั้งหมดนี้ก็อยู่บนพื้นฐานเดียวกับ Configuration Changes นั่นเอง