สวัสดีฉันสงสัยว่า Android จัดการหน่วยความจำอย่างไรและฉันไม่พบคำตอบที่แน่นอน สมมติว่าฉันมีแอปพลิเคชันที่มี 5 กิจกรรมในสแต็กกิจกรรมปัจจุบัน (4 หยุดและ 1 จะกลับมาทำงานต่อ) ไม่มีบริการเชื่อมต่อ ฉันกดปุ่ม HOME เพื่อให้กิจกรรมทั้งหมดของฉันหยุดลง ฉันเปิดแอปพลิเคชั่นที่ใช้หน่วยความจำอื่น ๆ และหน่วยความจำอุปกรณ์โดยรวมเริ่มเหลือน้อย และคำถามคือ
... จะเกิดอะไรขึ้นกับใบสมัครของฉัน?
- ระบบสามารถทำลายกิจกรรมเพียงอย่างเดียวหรือบางส่วนเพื่อกู้คืนหน่วยความจำได้หรือไม่?
- ระบบจะฆ่ากระบวนการทั้งหมดของแอปพลิเคชันของฉันหรือไม่ กิจกรรมทั้งหมดจะถูกทำลายลงหรือไม่?
- จะเกิดอะไรขึ้นเมื่อฉันกลับไปที่แอปพลิเคชันของฉันเมื่อมันถูกฆ่าทั้งหมด? จะเริ่มจากการขอทาน (เช่นการเริ่มครั้งแรก) หรือจะพยายามกู้คืนกิจกรรมให้กลับสู่สถานะที่เป็นที่นิยม / ถ้าใช่ - เป็นเพียงกิจกรรมที่อยู่ด้านบนสุดของสแต็กหรือทั้งหมด?
UPDATE:
ก่อนที่จะถามคำถามนี้ฉันเคยเห็นวงจรชีวิตของกิจกรรมสองสามครั้ง แต่ไม่มีคำตอบสำหรับคำถามของฉัน ฉันทำแบบทดสอบและมีคำตอบ "หยุดกระบวนการ" ใน DDMS เป็นเบาะแสสำหรับการทดสอบ
ฉันยังไม่ได้ทดสอบคำตอบสำหรับคำถาม 1 แต่ตามที่ไกด์บอกว่า:
หากกิจกรรมถูกหยุดชั่วคราวหรือหยุดระบบสามารถยกเลิกกิจกรรมจากหน่วยความจำได้โดยขอให้กิจกรรมนั้นเสร็จสิ้นหรือเพียงแค่ฆ่ากระบวนการ
ดูเหมือนว่ากิจกรรมอย่างน้อยหนึ่งอย่างสามารถทำลายได้อย่างนุ่มนวล (ด้วยวิธี onDestroy) โดยไม่ต้องฆ่ากระบวนการ คุณจะได้รับ (onCreate + bundle) เมื่อกลับไปหาพวกเขา
คำถาม 2 คำตอบ:
ใช่. โดยทั่วไประบบจะฆ่ากระบวนการทั้งหมดซึ่งหมายความว่าข้อมูลทั้งหมดรวมถึงกิจกรรมและฟิลด์คงที่จะถูกทำลาย สิ่งนี้ไม่ได้ทำอย่างดี - คุณจะไม่ได้รับ onDestroy หรือ finialize () สำหรับกิจกรรมที่หยุดชั่วคราว / หยุด นี่คือเหตุผลที่ saveInstanceState () ถูกเรียกก่อนเมธอด onPause onPause เป็นวิธีสุดท้ายที่คุณควรบันทึกบางสิ่งเพราะหลังจากวิธีนี้คุณจะไม่เห็น onStop หรือ onDestroy ระบบสามารถฆ่ากระบวนการทำลายวัตถุทั้งหมดของคุณได้ทุกสิ่งที่พวกเขาถือและสิ่งที่พวกเขากำลังทำ
คำถาม 3 คำตอบ:
จะเกิดอะไรขึ้นเมื่อคุณกลับไปที่แอปพลิเคชันที่ถูกฆ่า
- ก่อนหน้า Android 2.2 - แอปพลิเคชันจะเริ่มต้นจากการเริ่มต้นพร้อมกับกิจกรรมตัวเรียกใช้งาน
- เริ่มจาก 2.2 - ระบบจะกู้คืนสถานะแอปพลิเคชันก่อนหน้านี้ หมายความว่าอย่างไร? หมายความว่ากิจกรรมที่มองเห็นล่าสุดจะถูกสร้างขึ้นใหม่ (onCreate + bundle) จะเกิดอะไรขึ้นกับกองกิจกรรม สแต็คใช้ได้ดี แต่กิจกรรมทั้งหมดในนั้นตายไปแล้ว แต่ละรายการจะถูกสร้างขึ้นใหม่ (onCreate + bundle) เมื่อคุณกลับไปที่ปุ่มย้อนกลับ มีอีกอย่างหนึ่งเกี่ยวกับเรื่องนี้:
โดยปกติระบบจะล้างงาน (ลบกิจกรรมทั้งหมดออกจากสแต็กเหนือกิจกรรมรูท) ในบางสถานการณ์เมื่อผู้ใช้เลือกงานนั้นใหม่จากหน้าจอหลัก โดยทั่วไปแล้วจะเกิดขึ้นหากผู้ใช้ไม่ได้เข้าชมงานเป็นระยะเวลาหนึ่งเช่น 30 นาที
สรุป?
- อย่าคิดว่าการจัดการปัญหาการหมุนเวียนกิจกรรมสามารถแก้ไขได้ด้วย android: configChanges = "orientation" เมื่อคุณทำเช่นนั้นคุณจะได้รับปัญหาอื่น ๆ อีกมากมายที่คุณไม่รู้ด้วยซ้ำ
- ทดสอบแอปพลิเคชันของคุณด้วย DDMS - ปุ่มหยุดกระบวนการ ดูนี่
- ระมัดระวังเมื่อใช้ตัวแปรคงที่ อย่าคิดว่าเมื่อคุณเริ่มต้นในกิจกรรมที่ 1 คุณจะเริ่มต้นในกิจกรรมที่ 2 สถานที่ที่ปลอดภัยเพียงแห่งเดียวในการเริ่มต้นสถิติโลกคือคลาสแอปพลิเคชัน
- จำไว้ว่าคุณอาจไม่เคยเห็น onStop หรือ onDestroy ปิดไฟล์ / ฐานข้อมูลหยุดตัวดาวน์โหลดใน onPause เมื่อคุณต้องการให้แอปทำบางสิ่งใน BG - ใช้บริการเบื้องหน้า
ไม่ว่าจะเป็น ... หวังว่าฉันจะช่วยด้วย essey ของฉัน :)