onActivityResult () เรียกว่าก่อนกำหนด


92

ฉันเริ่มต้นActivity(ผู้สืบทอดPreferenceActivity) จากกิจกรรมคนงานของฉันดังนี้:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1458)
        loadInfo();
}

void showSettingsDialog()
{
    startActivityForResult(new Intent().setClass(this, MyConfigure.class), 1458);
}

MyConfigureชั้นเรียนไม่มีsetResult()สายใด ๆ ในความเป็นจริงMyConfigureชั้นไม่ได้มีรหัสใด ๆ ยกเว้นที่มันโหลดการตั้งค่าการใช้OnCreate()addPreferencesFromResource

ตอนนี้onActivityResultเรียกว่ามีrequestCodeของ1458ก่อนกำหนดหลังจากMyConfigureกิจกรรมเป็นระยะ ทดสอบกับ 1.6 และ 2.1 อีมูเลเตอร์รวมถึงอุปกรณ์ 2.1 มีการโทรไปsetResult()ฝังที่ไหนสักแห่งPreferenceActivityไหม? หรือจะอธิบายการโทรก่อนกำหนดนี้ได้อย่างไร?


1
กิจกรรมไม่ได้จบลงใน setResults () แต่จะสิ้นสุดเมื่อเสร็จสิ้น () คุณสามารถแสดงวิธีการ onCreate ของกิจกรรม MyConfigure ของคุณได้หรือไม่?
Cheryl Simon

ใช่มันไม่ได้ อย่างไรก็ตามมีบางอย่างเรียก setResult () ล่วงหน้าและฉันสงสัยว่ามันคืออะไร รหัสของ onCreate นั้นไม่สำคัญ: คลาสสาธารณะ MyConfigure ขยาย PreferenceActivity {@Override ป้องกันโมฆะ onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); addPreferencesFromResource (R.xml.preferences); }}
Eugene Mayevski 'Callback

คุณคิดอย่างไรที่จะรู้ว่า setResult เรียกว่า?
RoflcoptrException

นั่นคือสิ่งที่ฉันสร้างคำถามขึ้นมา หากต้องการทราบสาเหตุที่เรียกว่า onActivityResult ก่อนกำหนด
Eugene Mayevski 'Callback

ผลลัพธ์ logcat พูดอะไรในช่วงเวลานี้ โดยเฉพาะแท็ก "ActivityManager" ซึ่งแสดงว่า Intent ใดถูกเรียกใช้
Christopher Orr

คำตอบ:


254

สิ่งนี้ได้รับการแก้ไขโดยการเปลี่ยนโหมดเริ่มเป็นsingleTop:

    <activity
        android:name=".MainActivity"
        android:launchMode="singleTop">

มีข้อบกพร่อง / คุณลักษณะ (?) ใน Android ซึ่งรายงานผลทันที (ซึ่งยังไม่ได้ตั้งค่า) สำหรับActivityโดยประกาศว่าsingleTask(แม้ว่ากิจกรรมจะยังคงทำงานอยู่) ถ้าเราเปลี่ยนlaunchModeจากการทำกิจกรรมที่ผู้ปกครองจากsingleTaskการsingleTopทำงานทุกอย่างเป็นไปตามคาด - ผลจะรายงานเฉพาะหลังจากกิจกรรมเสร็จสิ้น แม้ว่าพฤติกรรมนี้จะมีคำอธิบายบางอย่าง ( singleTaskสามารถมีได้เพียงกิจกรรมเดียวและอาจมีพนักงานเสิร์ฟหลายคน) แต่นี่ก็ยังไม่ใช่ข้อ จำกัด เชิงตรรกะสำหรับฉัน


2
ดูเหมือนบั๊ก! ^^ พฤติกรรมแปลกมาก!
เฟลิเป้

7
หากกิจกรรมมีโหมดเปิดใช้งาน singleTask ไม่จำเป็นต้องรับผลลัพธ์จากกิจกรรมย่อยโดยใช้ onActivityResult กิจกรรมย่อยเพียงแค่เรียกเสร็จสิ้น () จากนั้นเริ่มกิจกรรมหลักด้วยเจตนาข้อมูล ในกิจกรรมหลักคุณต้องแทนที่เมธอด onNewIntent และกระบวนการที่ได้รับเจตนา
Nik

43
LaunchMode = "singleInstance" ก็ทำให้เกิดพฤติกรรมนี้เช่นกัน
ffleandro

1
ดูเหมือนว่าวิธีนี้ใช้ไม่ได้ผลสำหรับฉันฉันลอง singleTop ในกิจกรรมของผู้ปกครอง แต่ไม่เป็นประโยชน์ ฉันยังตั้งค่าสถานะความตั้งใจเป็น FLAG_ACTIVITY_SINGLE_TOP แม้ว่าตอนนี้คำขอจะแสดงค่าที่ถูกต้อง แต่ผลลัพธ์จะเป็น 0 เสมอ
Neon Warge

11
มันเกิดขึ้นใน Kitkat 4.4.4 ไม่ได้เกิดขึ้นกับ Lolipop
Somasundaram Mahesh

18

ฉันจะแก้ไขปัญหาของฉันหลังจากลบก่อนที่จะเรียกintent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);fragment.startActivityForResult(intent, 0);


1
ขอบคุณ! สิ่งนี้ช่วยแก้ปัญหาของฉันได้ มีคำอธิบายสำหรับสิ่งนี้หรือไม่?
Conner Harkness

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

5

ฉันเพิ่งลบ "android: launchMode" ที่กำหนดเองทั้งหมดออกจากกิจกรรมของฉันและทุกอย่างทำงานได้อย่างมีเสน่ห์ ไม่ใช่ความคิดที่ดีที่จะเปลี่ยนสิ่งนี้เมื่อคุณไม่รู้แน่ชัดว่า Android กำลังเข้าใจอะไร ... Android ค่อนข้างยุ่งยากในลักษณะนี้


1

สิ่งนี้เกิดขึ้นกับฉันเมื่อเจตนามีการIntent.FLAG_RECEIVER_FOREGROUNDตั้งค่าสถานะ

(ใช่ธงนั้นไม่เกี่ยวข้องกับกิจกรรม แต่ฉันมีไว้ในความตั้งใจทั้งหมดของฉันซึ่งเป็นส่วนหนึ่งของวิธีแก้ปัญหาปืนลูกซองสำหรับปัญหาอื่น)


-1

อีกครั้งเช่นเดียวกับในความคิดเห็นของ Mayra setResult()ไม่มีส่วนเกี่ยวข้องกับปัญหาของคุณ ด้วยเหตุผลบางประการMyConfigureคลาสจะเสร็จสิ้นตัวเองและเมื่อมันเกิดขึ้นPreferenceActivityเพียงแค่สันนิษฐานว่าอาจมีผลมาจากMyConfigureเพราะนั่นคือวิธีที่คุณเขียนโค้ด

สิ่งนี้จะเกิดขึ้นเมื่อคุณบังคับกลับกิจกรรมใด ๆ ที่เริ่มต้นด้วยstartActivityForResult()...

ดังนั้นฉันคิดว่าเป็นการดีกว่าที่จะมุ่งเน้นว่าทำไมMyConfigureชั้นเรียนของคุณจึงถูกบังคับให้เรียนจบ


คลาส MyConfigure ไม่เสร็จสิ้นการคาดเดาของคุณผิดขออภัย ถ้าเป็นเช่นนั้นจะไม่มีคำถาม
Eugene Mayevski 'Callback
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.