จะเกิดอะไรขึ้นเมื่อคุณปัดแอพออกจากรายการแอพล่าสุด


147

รายการแอพล่าสุดใน Ice Cream Sandwich เพิ่มความสามารถในการปัดแอพออกจากรายการดังนั้นจึงยกเลิกแอพอย่างถาวร (และเท่าที่ฉันรู้ว่านี่เป็นฟังก์ชั่นวานิลลาไม่ใช่ ROM / CM ที่กำหนดเอง) ไฮไลท์เอกสารและแพลตฟอร์มไม่ปรากฏขึ้นเพื่อครอบคลุมการทำงานของฟังก์ชันนี้ แต่ฉันอยากรู้ว่าระบบกำลังทำอะไรอยู่

ต่อไปเพิ่มความอยากรู้ของฉันฉันตัดสินใจที่จะทำการทดสอบอย่างรวดเร็ว: ฉันเริ่มต้นเพลงในการติดตั้ง CM9 แล้วสำรองข้อมูลออกมา จากนั้นฉันจะตรวจสอบรายการแอพล่าสุดและเห็นว่ามันอยู่ที่นั่นจริง ๆ (และอยู่ในสถานะที่เหมาะสมตามภาพขนาดย่อ) จากนั้นฉันก็เข้าสู่Settings->Applicationsและบังคับให้หยุดแอปเพลง แต่ก็ยังคงอยู่ในรายการล่าสุดทำให้ฉันเชื่อว่ามันไม่ได้เชื่อมต่อกับกระบวนการที่อยู่ในพื้นหลัง

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

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

คำตอบ:


68

การปัดแอปออกจากรายการแอพล่าสุดคือวานิลลาและใช่ไม่ใช่เอกสารที่ดี นี่เป็นหัวข้อของการอภิปรายในฟอรัม Android ที่หลากหลาย ... ฉันทามติดูเหมือนจะอธิบายได้ดีที่สุดในความคิดเห็นบางส่วน : พฤติกรรมนั้นคล้ายกับ แต่ไม่เหมือนกับการปิดแอปโดยทั่วไป ( สำหรับแอพที่ไม่ได้กำหนดการจัดการปุ่มย้อนกลับอย่างชัดเจน) มันเหมือนกับการกดปุ่มย้อนเวลากลับไปจากภายในแอพพลิเคชั่นที่คุณออกไป

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

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


1
ขอบคุณลิงค์นี้มีการพูดคุยที่ดีมากมาย คุณอาจจะถูก: เพลงที่อาจทดสอบได้ไม่ดี ฉันจะลองใช้แอพอื่นเพียงเพื่อเตะ
eldarerathis

2
จะไปข้างหน้าและยอมรับนี้ตั้งแต่การอภิปราย Reddit ช่วยให้ฉันพบคำค้นหาบางคำที่ดีกว่าและดูเหมือนจะยืนยันโดยการโพสต์บางอย่างโดย Dianne Hackborn ที่ผมระบุไว้ในคำตอบของฉัน ขอบคุณ!
eldarerathis


1
สมบูรณ์แบบขอบคุณ! สำหรับฉันโพสต์นี้ช่วยฉันได้: reddit.com/r/Android/comments/mpevh/ …
Boris Strandjev

ผู้เล่นเพลงบุคคลที่สามอย่าง Rocket Player จะหยุดเพลงเมื่อคุณปัดแอพจากรายการล่าสุดแม้ว่าบริการจะทำงานในพื้นหลังและคุณต้องเปิดแอพหรือเล่นในวิดเจ็ตอีกครั้งเพื่อเริ่มเพลง
Lucky

78

ดูเหมือนว่าฉันจะพบคำค้นหาวิเศษที่นำไปสู่คำอธิบายบางอย่างจากพนักงานของ Google โดยเฉพาะฉันพบสองสถานที่ต่าง ๆ ที่ Dianne Hackborn อธิบายว่าเกิดอะไรขึ้นเมื่อคุณกวาดบางสิ่งออกจากรายการล่าสุด สิ่งแรกคือความคิดเห็นของหนึ่งในโพสต์ Google+ ของเธอ :

[W] หมวกจะเกิดขึ้นเป็นพิเศษเมื่อคุณปัดงานล่าสุดคือ: (1) ฆ่าพื้นหลังหรือกระบวนการที่ว่างเปล่าของแอปพลิเคชัน (ดู http://developer.android.com/guide/topics/fundamentals/processes-and-) threads.html # Lifecycle สำหรับสิ่งที่มีความหมาย) และ (2) ใช้ http://developer.android.com/reference/android/app/Service.html#onTaskRemoved(android.content.Intent) API อันใหม่เพื่อบอก บริการของแอปพลิเคชันเกี่ยวกับงานที่ถูกลบเพื่อให้สามารถทำสิ่งที่คิดว่าเหมาะสม

เธอยังบันทึกในความคิดเห็นบล็อก :

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

หากคุณต้องการหยุดแอพอย่างสมบูรณ์คุณสามารถกดงานล่าสุดเพื่อไปที่ข้อมูลแอพและกดปุ่มหยุดที่นั่น สำหรับการหยุดคือการฆ่าแอปที่สมบูรณ์ - กระบวนการทั้งหมดถูกฆ่า, บริการทั้งหมดหยุด, ลบการแจ้งเตือนทั้งหมด, ลบการเตือนภัยทั้งหมด, ฯลฯ แอปไม่ได้รับอนุญาตให้เปิดอีกครั้งจนกว่าจะมีการร้องขออย่างชัดเจน

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


นั่นเป็นพฤติกรรมที่ไม่ชัดเจนและน่าสนใจมาก!
Matthew อ่าน

"ทำลายกระบวนการพื้นหลังใด ๆ ที่มีอยู่สำหรับกระบวนการโดยจะไม่ทำให้บริการหยุดลงโดยตรง" สิ่งนี้ยังคงเป็นจริงหรือไม่? ฉันทำการทดสอบเมื่อวานนี้ เมื่อวานฉันกวาดแอพที่มีบริการแบ็คกราวน์ในกระบวนการหลัก แอพ => Running UI แสดงกระบวนการ 0 รายการและบริการ 0 รายการ หลังจากนั้นฉันก็กวาดแอพตัวเดิมออกไปโดยที่กระบวนการทำงานในกระบวนการเฉพาะแอปพลิเคชันแยกต่างหาก apps => UI ที่ทำงานอยู่บอกว่าฉันมีกระบวนการ 0 รายการและบริการ 1 รายการ นั่นคือใน Moto X (2014) กับ Android 4.4.4
Steven Wexler

@StevenWexler: อาจเป็นได้ว่าบริการสิ้นสุดลงด้วยตัวเองในกรณีแรก แต่ไม่ใช่ครั้งที่สองหรือเป็นไปได้ว่าในสถานการณ์ที่สองกระบวนการหลักกำหนดไว้ (ด้วยเหตุผลบางอย่าง) ที่ไม่ต้องการหยุดบริการ ยากที่จะรู้แน่นอน
eldarerathis

บริการที่เริ่มแล้วจะเริ่มต้นโดยอัตโนมัติอีกครั้งหลังจากที่กวาดออกจากรายการล่าสุดมัน onCreate เรียกว่า แต่ในแอพบางตัวที่ onCreate จะเรียกมาก่อน onTaskRemoved และในบางแอพที่เรียกว่า onTaskRemoved เหตุใดพฤติกรรมนี้จึงเป็นเช่นนั้น
umesh

21

มีข้อมูลบางส่วนในรหัสแหล่งที่มาในชั้นเรียนเป็นcom.android.internal.policy.impl.RecentApplicationsBackgroundและcom.android.internal.policy.impl.RecentApplicationsDialog

ถ้าฉันอ่านอย่างถูกต้องมีตัวจัดการเฉพาะสำหรับการเลือกแอพ แต่ไม่มีอะไรพิเศษสำหรับการกวาดพวกมันยกเว้นการonDetachedFromWindow()โทรcom.android.View.onDetachedFromWindow()ที่ซ่อนองค์ประกอบและล้างข้อมูลของมัน นี่จะบอกเป็นนัยกับความจริงที่ว่าไม่มีสิ่งใดเกิดขึ้นเป็นพิเศษในการปัดแอพซึ่งสอดคล้องกับคำตอบของ Austin Mills เนื่องจากเนื่องจากรายการไม่แสดงแอพที่ใช้งานอยู่การonPause()โทรของระบบและอื่น ๆ เกิดขึ้นแล้ว


10

ฉันคิดว่ามันจะทำเช่นเดียวกับปุ่มย้อนกลับทำ ยกเว้นการเปลี่ยนแปลงเพียงเล็กน้อย มันจะเป็นfinish()กิจกรรม / ชิ้นส่วนทั้งหมดในแอป

เพิ่งทำการทดสอบเล็กน้อยด้วยแอพสร้างตัวเองขึ้นมาเล็กน้อย คุณสามารถทดสอบได้เช่นกัน แอปทดสอบของฉันอยู่ที่นี่: https://bitbucket.org/Leandros99/lifecycletest (ดาวน์โหลดได้เช่นกันสำหรับผู้ที่ไม่สามารถสร้างได้)
ในทุกวิถีชีวิตของกิจกรรม ( http://developer.android.com/reference/android/app) /Activity.html#ActivityLifecycle ) พิมพ์บันทึกของแอป คุณสามารถดูได้ด้วย adb logcat (ติดตั้ง Android SDK, cd ไปยังเครื่องมือแพลตฟอร์มใน cmd / shell และประเภทadb logcatตอนนี้คุณจะเห็นทุกครั้งที่คุณทำอะไรเช่นกดปุ่มย้อนกลับหรือปุ่มโฮมแอปจะพิมพ์วิธีวงจรชีวิตดังกล่าวข้างต้น )

คำถามของคุณ: ถ้าฉันปัดแอพจากลิ้นชักแอพล่าสุดonDestroyวิธีนั้นจะถูกเรียก มันเกือบจะเหมือนกับปุ่มย้อนกลับ
หวังว่าฉันช่วยหน่อย หากมีคำถามให้ถาม


3

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


1
แม้ว่าจะเขียนด้วยภาษาทุกวันนี่เป็นคำตอบที่ถูกต้องทีเดียว - มันจับความจริงที่ว่ากระบวนการนั้นถูกกำจัดไปแล้วมีคำตอบอื่นอีกมากมาย อย่างไรก็ตามสิ่งที่ขาดหายไปคือการสำนึกว่า Android จะจัดการกระบวนการเมื่อจำเป็นเพื่อให้ได้หน่วยความจำอย่างไรก็ตามเมื่อทำการล้างหน่วยความจำเสร็จแล้วจะเกิดขึ้นโดยอัตโนมัติหาก / จำเป็น
Chris Stratton
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.