onNewIntent () วงจรชีวิตและผู้ฟังที่ลงทะเบียน


150

ฉันใช้กิจกรรม singleTop onNewIntent()เจตนาที่จะได้รับจากการค้นหาโต้ตอบผ่าน

สิ่งที่ผมสังเกตเห็นก็คือว่าonPause()จะเรียกว่าก่อนแล้วหลังจากนั้นจะเรียกonNewIntent() onResume()สายตา:

  • กล่องโต้ตอบการค้นหาเริ่มต้น
  • เจตนาการค้นหาถูกไล่ออกจากกิจกรรม
  • onPause()
  • onNewIntent()
  • onResume()

ปัญหาคือฉันมีผู้ฟังที่ลงทะเบียนในonResume()ที่ได้รับการลบonPause()แต่พวกเขามีความจำเป็นในการonNewIntent()โทร มีวิธีมาตรฐานในการทำให้ผู้ฟังเหล่านั้นว่างหรือไม่?

คำตอบ:


294

onNewIntent()มีไว้เพื่อเป็นจุดเริ่มต้นสำหรับกิจกรรม singleTop ที่ทำงานอยู่ที่อื่นแล้วในสแต็กดังนั้นจึงไม่สามารถโทรonCreate()ได้ จากกิจกรรมวงจรชีวิตมุมมองมันจึงจำเป็นที่จะโทรมาก่อนonPause() ผมแนะนำให้คุณที่จะเขียนกิจกรรมของคุณจะไม่ใช้ฟังเหล่านี้ภายในของonNewIntent() onNewIntent()ตัวอย่างส่วนใหญ่onNewIntent()วิธีการของฉันมีลักษณะเช่นนี้:

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    // getIntent() should always return the most recent
    setIntent(intent);
}

ด้วยเหตุผลการตั้งค่าทั้งหมดที่เกิดขึ้นในโดยใช้onResume()getIntent()


@Rodja คุณจะกรุณาแสดงความคิดเห็นในstackoverflow.com/questions/19092631/นี้ด้วย
พัฒนา

3
ที่เกี่ยวข้องกับคำถามเดิม: เก็บไว้ในใจถ้าคุณย้ายรหัสในการจัดการการค้นหาIntentลงในonResume()กิจกรรมของคุณอาจจะพยายามที่จะดำเนินการค้นหาทุกครั้งที่มันดำเนินการต่ออาจจะไม่ได้มีพฤติกรรมที่คุณต้องการ
Tony Chan

1
Rodja พูดว่า: จากมุมมองวงจรชีวิตของกิจกรรมดังนั้นจึงจำเป็นต้องเรียกใช้ onPause () ก่อน onNewIntent () Android ไม่ต้องการออกแบบด้วยวิธีนี้ กิจกรรมของคุณผ่านวงจรชีวิตไปแล้วเพื่อดำเนินการต่อ () ไม่มีความต้องการสำหรับ Android ที่จะเรียกใช้ onPause () จากนั้นโทร onResume () อีกครั้ง หากแอปทำงานต่อระบบปฏิบัติการสามารถเรียก onNewIntent () และอยู่ในสถานะเริ่มต้นต่อไป
Sani Elfishawy

Rodja พูดว่า: จากมุมมองวงจรชีวิตของกิจกรรมดังนั้นจึงจำเป็นต้องเรียกใช้ onPause () ก่อน onNewIntent () Android ไม่จำเป็นต้องออกแบบมัน กิจกรรมของคุณผ่านวงจรชีวิตแล้วเพื่อดำเนินการต่อ หากการดำเนินการนั้นดำเนินต่อไปพวกเขาสามารถเรียก onNewIntent () และอยู่ในการดำเนินการต่อ ปัญหาเกี่ยวกับลำดับของ Android คือทำให้ไม่สามารถแยกความแตกต่างระหว่าง onPause ได้เนื่องจากการกระทำของผู้ใช้กับ onPause เนื่องจากเจตนาเบื้องหลัง หากคุณต้องการที่จะดำเนินการหยุดชั่วคราวเฉพาะในกรณีที่การกระทำของผู้ใช้คุณจะเมาเพราะคุณจะไม่ทราบจนถึงอนาคตว่าทำไมคุณไป onPause ()
Sani Elfishawy

จุดสำคัญที่ควรทราบคือ getIntent () ยังคงส่งคืนเจตนาดั้งเดิม คุณสามารถใช้ setIntent (Intent) เพื่ออัปเดตเป็น Intent ใหม่ได้
linuxjava

15

หมายเหตุ: การเรียกใช้เมธอดวงจรชีวิตจากอีกวิธีหนึ่งไม่ใช่วิธีปฏิบัติที่ดี ในตัวอย่างด้านล่างฉันพยายามที่จะทำให้ onNewIntent ของคุณถูกเรียกโดยไม่คำนึงถึงประเภทกิจกรรมของคุณ

OnNewIntent () ได้รับการเรียกสำหรับกิจกรรม singleTop / Task เสมอยกเว้นเป็นครั้งแรกที่มีการสร้างกิจกรรม ในเวลานั้น onCreate เรียกว่าการแก้ปัญหาสำหรับแบบสอบถามจำนวนน้อยที่ถามในชุดข้อความนี้

คุณสามารถเรียกใช้ onNewIntent ได้เสมอโดยใส่ไว้ในวิธีการสร้างเช่น

@Override
public void onCreate(Bundle savedState){
    super.onCreate(savedState);
    onNewIntent(getIntent());
}

@Override
protected void onNewIntent(Intent intent) {
  super.onNewIntent(intent);
  //code
}

59
โดยทั่วไปแล้วไม่ใช่ความคิดที่ดีที่จะเรียกใช้วิธีการวงจรชีวิตโดยตรงไม่ใช่หรือ? อาจไม่เป็นอันตรายหรืออาจมีการใช้งานฐานของ onNewIntent () สมมติว่า onPause () ถูกเรียกใช้แล้ว น่าจะปลอดภัยกว่าในการห่อหุ้มรหัสแอปในวิธีที่เรียกใช้ได้จากทั้งสองสถานที่
BernalKC

12
ตกลง เราพบกรณีผู้ใช้ขอบสองสามรายโดยใช้วิธีนี้ หลีกเลี่ยงที่ดีที่สุด
Saad Farooq

3
ใช่ .. ฉันเห็นด้วยกับการหลีกเลี่ยงสิ่งนี้ ... นี่คือสำหรับผู้ที่ต้องการเรียกใช้ onNewIntent จาก onCreate เช่นกัน
Pawan Maheshwari
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.