Android - startActivityForResult จะเรียกใช้งาน ActivityResult ทันที


144

ฉันกำลังเปิดตัวกิจกรรมจากกิจกรรมหลักในแอปของฉันโดยใช้การโทรstartActivityForResult(intent, ACTIVITY_TYPE)และพวกเขาทั้งหมดทำงานได้ แต่หนึ่ง

กิจกรรมนี้เรียกว่าเปิดตัวกิจกรรมตามที่ต้องการ แต่ในบันทึกฉันเห็นว่าonActivityResult()มันถูกทริกเกอร์ทันที กิจกรรมการแสดง แต่ถูกส่งกลับทันที RESULT_CANCELEDonActivityResult()

จากนั้นฉันโต้ตอบกับกิจกรรมกดปุ่มที่โทรfinish()และonActivityResult()ไม่ได้เรียกในเวลานี้ (เพราะเห็นได้ชัดว่ามีการส่งคืนผลลัพธ์แล้ว)

มันสมเหตุสมผลกับทุกคนไหม? มีใครเคยเห็นพฤติกรรมนี้มาก่อนหรือไม่

คำตอบ:


315

คุณไม่สามารถใช้startActivityForResult()ถ้ากิจกรรมของคุณจะถูกเปิดตัวเป็นหรือsingleInstance หรือโหมดเรียกใช้งานจะแก้ไขปัญหาsingleTaskstandardsingleTop


2
ขอบคุณคุณทั้งคู่ฉันมีสิ่งนี้ในไฟล์รายการและลืมมันไปหมดเลย
TomBomb

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

20
singleTopดูเหมือนดีสำหรับฉันsingleTaskแต่เป็นสาเหตุของปัญหานี้และด้วยเหตุนี้singleInstanceจะทำเช่นกันแน่นอน
darnmason

4
ฉันใช้เวลาแก้จุดบกพร่องนี้นานเกินไป! ขอบคุณ !!
suomi35

4
ในกรณีของฉันไม่ได้กำหนดคลาสใด ๆ เป็น singleInstance หรือ singleTop แต่ยังคงเกิดขึ้น ... คำแนะนำใด ๆ
รหัส

110

นอกจากนี้ตรวจสอบให้แน่ใจว่าเจตนาไม่ได้มีการIntent.FLAG_ACTIVITY_NEW_TASKตั้งค่า

จากเอกสาร :

ไม่สามารถใช้การตั้งค่าสถานะนี้เมื่อผู้เรียกร้องขอผลลัพธ์จากกิจกรรมที่กำลังเรียกใช้


3
การแก้ไขปัญหาในกรณีของฉัน ปัญหาไม่ได้เกิดจาก singleInstance, singleTop หรือ singleTask
ไดอาน่า

คุณเป็นมิ้นต์ (A life saver) นี่เป็นปัญหาที่แน่นอนของฉันเมื่อฉันต้องการให้ผู้ใช้จับภาพในชิ้นส่วน
kyay

@ ไดอาน่าคุณจำสิ่งที่คุณใช้แทนIntent.FLAG_ACTIVITY_NEW_TASKหรือไม่
Keselme

@Keselme ขออภัยเป็นเวลานานแล้วฉันหวังว่าฉันจะช่วยได้ แต่ฉันจำไม่ได้และฉันไม่สามารถเข้าถึงรหัสนั้นได้อีก
ไดอาน่า

ใช่แก้ไขแล้ว startActivityForResult ไม่ควรใช้กับ Intent FLAG_ACTIVITY_NEW_TASK
hanilozmen

21

ฉันเคยเห็นพฤติกรรมนี้มาก่อนโปรดตรวจสอบให้แน่ใจว่ากิจกรรม destnation ของคุณ (กิจกรรมพิเศษนั้น) ไม่ได้singleInstanceอยู่ในไฟล์ AndroidManifest หากกิจกรรมเป็นsingleInstanceแล้วมันจะกลับมาRESULT_CANCELEDก่อนที่จะเปิดตัว!


18

ฉันต้องการเพิ่มว่าคุณสามารถโทรหาแอปภายนอกด้วย:
Intent in = caller.getPackageManager().getLaunchIntentForPackage("com.your.package.here");
ซึ่งจะสร้างความตั้งใจด้วยการIntent.FLAG_ACTIVITY_NEW_TASKเพิ่มโดยค่าเริ่มต้นดังนั้นการโทร:
in.setFlags(0);
ซึ่งจะล้างค่าสถานะนั้นแล้วคุณสามารถดำเนินการต่อไป:startActivityForResult(in, action);

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


ฉันรู้ว่านี่เป็นรุ่นเก่า แต่นี่เป็นสิ่งที่มีค่าอย่างยิ่งสำหรับฉันที่ฉันอยากจะขอบคุณผู้ใช้และชี้ให้เห็นว่าใครก็ตามที่กระโดดไปมาระหว่างกิจกรรมต่างๆ บันทึกตูดของฉันในระหว่างการแฮ็กฮ็อต;)
Wes Winn

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

โหวตคำตอบนี้เพราะนี่เป็นปัญหาที่ฉันต้องทำเมื่อเช้านี้! ขอบคุณสำหรับการแก้ปัญหา!
Will Johnson เมื่อ

ขอบคุณ intent.setFlags (0) แก้ไขปัญหา ตอนนี้แอปที่สองเริ่มต้นแล้วและส่งคืนผลลัพธ์ให้แอปที่เรียก
Niaz

5

startActivityForResult()ไม่ทำงานกับsingleInstanceหรือsingleTaskกิจกรรมใน Android รุ่นก่อนอมยิ้ม ตั้งแต่ Android 5 ใช้งานได้ (ดูคำตอบนี้สำหรับรายละเอียดเพิ่มเติม)


5

นอกจากนี้ยังก่อให้เกิดถ้าคุณมีFLAG_ACTIVITY_NEW_TASKความตั้งใจของคุณ

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(intent, REQUEST_CODE);

ขอบคุณ ฉันเพิ่ม FLAG_ACTIVITY_NEW_TASK ในกิจกรรมของฉัน
Chirag Savsani

1

ปัญหาของฉันเกิดจากกิจกรรมการโทร ประกาศใน AndroidManifest มีคุณสมบัติดังต่อไปนี้:

android:noHistory="true"

เปลี่ยนเป็น "false" และตอนนี้ใช้ได้ดี


1

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

  • กิจกรรมทั้งหมดจะมีแอตทริบิวต์ Affinity ของภารกิจเดียวกัน ( TaskAffinity = "[SAME STRING]")
  • launchmode=singleTop,
  • launchIntent.SetFlags(0); // for reset default Intent flags if you launch from package manager

วิธีนี้ใช้ได้กับ Android ทุกรุ่น

ดูสิ่งนี้สำหรับ taskAffinity: https://asyoulook.com/computers%20&%20internet/android-onactivityresult-being-called-instantly/1004072


1

นอกจากนี้ให้ตรวจสอบว่า Android: noHistory = "true" กับกิจกรรมใน Manifest หรือไม่ถ้าใช่มันจะไม่ทำงาน


0

สำหรับActivityGroupหรือTabHostและอื่น ๆ อาจxxxActivityเป็นsubActivityของผู้ปกครอง จากนั้นstartActivityForResultไม่สามารถทำงานได้ แต่ผู้ปกครองจะได้รับผล

  1. โทรgetParent().startActivityForResult()จากกิจกรรมย่อยของคุณ

  2. ผู้ปกครองของคุณ (คนActivityGroup) onActivityResultจะสามารถที่จะจัดการกับ ดังนั้นผมจึงสร้าง subclass ของและการจัดการนี้ActivityGrouponActivityResult

  3. คุณสามารถกำหนดเส้นทางใหม่ที่กลับไปยังกิจกรรมย่อยได้หากต้องการ getLocalActivityManager().getCurrentActivity()เพิ่งได้รับกิจกรรมปัจจุบันโดย กิจกรรมย่อยของฉันสืบทอดมาจากกิจกรรมที่กำหนดเองดังนั้นฉันจึงเพิ่ม a handleActivityResult(requestCode, resultCode, data)ในคลาสย่อยสำหรับการActivityGroupโทร

ตัวอย่าง: http://www.cnblogs.com/relinson/archive/2012/03/25/startActivityForResult.html


คุณคิดอย่างไรเกี่ยวกับกรณีพิเศษนี้เมื่อเรียกเบราว์เซอร์เว็บเริ่มต้น: codeproject.com/Questions/990063//
อาห์มัด Ebrahimi

0

onActivityResult()นอกจากนี้ยังจะผ่านRESULT_CANCELEDเป็นresultCodeถ้าคุณสะกดแพคเกจหรือระดับชื่อในแฟ้มที่ประจักษ์


0

ใน Android Manifest set android:launchMode="singleTop"สำหรับกิจกรรมที่คุณต้องการเปิดด้วยผลลัพธ์และขณะเปิดแฟล็กชุดกิจกรรมintent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);


0

หากคุณกำหนดไว้android:noHistory="true"ในกิจกรรมใน AndroidManifest.xml ของคุณจะทำให้เกิดปัญหาเดียวกันที่นี่

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