Activity.finish () ทำงานอย่างไรใน Android


108

ใครช่วยให้คำอธิบายว่าเกิดอะไรขึ้นเมื่อActivityเรียกfinish()ใช้วิธีนี้

มันออกทันทีหรือไม่หรือทำหน้าที่ที่เรียกว่าเสร็จสมบูรณ์?


เธรดที่เกี่ยวข้อง - เมธอด Activity.finish () กำลังทำอะไรอยู่
RBT

คำตอบ:


123

มันออกทันทีหรือเสร็จสิ้นฟังก์ชันที่เรียกว่า?

เมธอดที่เรียกfinish()จะทำงานจนเสร็จสิ้น การfinish()ดำเนินการจะไม่เริ่มต้นจนกว่าคุณจะกลับสู่การควบคุม Android


3
แล้วจะทำกิจกรรมที่เรียกโดย StartAvtivityforResults () โดยไม่เสร็จได้อย่างไร?
Ayush Pateria

@CommonsWare เราจะมั่นใจได้อย่างไรว่า onStop ถูกเรียกใช้เสมอ? ในแอปของฉัน OnStop และ onDestroy จะไม่ถูกเรียกในบางกรณีและในกรณีดังกล่าวกิจกรรมของเด็กใช้เวลามากเกินไปในการจบและดูเหมือนว่าแอปจะแขวนคอ ... ในขณะที่เมื่อเรียกว่า onStop ทุกอย่างทำงานได้ตามปกติ ฉันใช้ Galaxy y ที่ใช้ Android 2.3.6 ... ดูคำถามของฉันที่stackoverflow.com/questions/13928591/…โปรดช่วยด้วย !!!
Amit

@CommonsWare ฉันทดสอบคุณชายมากจริง + 1 สำหรับคุณ แต่ฉันอยากจะถามคำถามหนึ่งข้อที่ฉันเขียนเสร็จ () เป็นคำสั่งแรกในฟังก์ชันของฉันจากนั้นมันจะเรียกใช้ฟังก์ชันทั้งหมดจากนั้นจึงเสร็จสิ้น () เรียกว่าวิธีการจัดการนี้
Nikhil Agrawal

@NikhilAgrawal คุณสามารถให้ฟังก์ชันของคุณกลับมาได้ทันทีหลังจากเรียกเสร็จ ()
antonio081014

Finish () เรียก onPause () และ onStop () ก่อนเรียก onDestroy () ด้วยหรือไม่
sr09

20

ทุกเหตุการณ์วงจรชีวิตเช่นonCreate, onResume, onPause.... onDestroyของกิจกรรมอยู่เสมอเรียกว่าเส้นเดียว - "การหัวข้อหลัก"

ในระยะสั้นเธรดนี้ได้รับการสนับสนุนโดยคิวที่มีการโพสต์กิจกรรมกิจกรรมทั้งหมด เธรดนี้สามารถรันเหตุการณ์เหล่านี้ทั้งหมดตามลำดับการแทรก

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


13

ondestroy() เป็นสายสุดท้ายที่คุณได้รับก่อนที่กิจกรรมของคุณจะถูกทำลาย

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


1

หากมีสองกิจกรรม A และ B และโฟลว์ของคุณกำลังไปจาก A> B; และ B = finish()สาย

จากนั้น

วิธีการที่คุณเรียกfinish()จากจะดำเนินการตามที่ Mark กล่าวถึง และขั้นตอนการโทรกลับจะเป็นดังนี้ -

  1. onPause() ของ activity A
  2. onRestart()> onStart()> onResume()กิจกรรม B
  3. จากนั้นความแตกต่างที่แท้จริงมา หากคุณไม่ได้โทรfinish()จากactivity A; เพียง แต่onStop()ของActivity Aจะถูกเรียกว่าที่นี่ ในขณะที่ในกรณีนี้ที่เราเรียกว่าfinish()จากActivity A; ดังนั้นonStop()และทั้งสองจะได้รับการเรียกร้องให้onDestroy()activity A
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.