setResult(Activity.RESULT_OK, returnIntent) จากกิจกรรมย่อยจะส่งคืนกิจกรรมให้ฉันเสมอ ยกเลิกไปที่กิจกรรมหลัก

ฉันต้องการส่งคืนข้อมูลบางส่วนจากกิจกรรมลูกของฉัน ActivityChild ไปยังกิจกรรมหลักของฉัน ActivityMain

ก่อนอื่นฉันจะโทรหา ActivityChild จาก ActivityMain ของฉันด้วยวิธีนี้:

val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
startActivityForResult(intent, 1)
// Actually, this code first launch chrome, then when the user identify on
// chrome, the redirect_uri calls the ActivityChild

จากนั้นฉันจะคืนข้อมูลของฉันจาก ActivityChild ถึง ActivityMain ด้วยวิธีนี้:

val data: Uri? = intent.data
val returnedIntent = Intent();
returnedIntent.putExtra("code", data!!.getQueryParameter("code"))
setResult(Activity.RESULT_OK, returnedIntent)
finish()

และในที่สุดฉันก็จับข้อมูลด้วยการแทนที่ onActivityResult ใน ActivityMain :

public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == 1) {
        if (resultCode == Activity.RESULT_OK) {
            val returnedValue = data!!.getStringExtra("data")
        }
        else if (resultCode == Activity.RESULT_CANCELED)
            Log.d("mDebug", "Couldn't retrieve data") // Always enters here
        else
            Log.d("mDebug", "final")
    }
}

มันจะดำเนินต่อไปในเงื่อนไข Activity.RESULT_CANCELED ฉันไม่สามารถแก้ไขปัญหานี้ได้ หากสามารถแก้ไขได้

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


person HartWoom    schedule 06.03.2019    source แหล่งที่มา
comment
คุณได้เปลี่ยนโหมดการเปิดตัวของ ActivityChild หรือไม่?   -  person Jeffrey Blattman    schedule 07.03.2019
comment
ฉันจะเปลี่ยนโหมดการเปิดตัวได้อย่างไร?   -  person HartWoom    schedule 07.03.2019


คำตอบ (2)


คุณสามารถพิจารณาเพิ่มแฟล็กนี้ FLAG_ACTIVITY_FORWARD_RESULT ไปยัง returnedIntent ของคุณ มีการอธิบายไว้ที่นี่ https://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_FORWARD_RESULT

หากตั้งค่าไว้และมีการใช้จุดประสงค์นี้เพื่อเปิดตัวกิจกรรมใหม่จากกิจกรรมที่มีอยู่ เป้าหมายการตอบกลับของกิจกรรมที่มีอยู่จะถูกถ่ายโอนไปยังกิจกรรมใหม่ ด้วยวิธีนี้ กิจกรรมใหม่สามารถเรียก Activity.setResult(int) และให้ผลลัพธ์นั้นถูกส่งกลับไปยังเป้าหมายการตอบกลับของกิจกรรมดั้งเดิม

person Bach Vu    schedule 07.03.2019
comment
ฉันเพิ่ม returnIntent.flags = Intent.FLAG_ACTIVITY_FORWARD_RESULT ในกิจกรรมลูกของฉัน แต่น่าเสียดายที่มันใช้งานไม่ได้ - person HartWoom; 07.03.2019
comment
ทำไมต้องเป็นกิจกรรมเด็ก? คุณควรใส่ไว้ในเจตนาเมื่อ startActivityForResult - person Bach Vu; 07.03.2019
comment
เพราะมันจะทำให้แอพพลิเคชั่นล่ม - person HartWoom; 07.03.2019
comment
บันทึกข้อขัดข้องคืออะไร? - person Bach Vu; 07.03.2019
comment
FORWARD_RESULT_FLAG ใช้ในขณะที่ขอผลลัพธ์ด้วย ฉันแค่ต้องการชี้แจงว่ากิจกรรมของฉันถูกเรียกอย่างไร: ActivityMain เปิดตัว Google Chrome ด้วยความตั้งใจ เมื่อผู้ใช้เข้าสู่ระบบ การเปลี่ยนเส้นทางจะเรียก ActivityChild จาก ActivityChild ฉันต้องการส่งข้อมูลกลับไปยัง ActivityMain หวังว่าความช่วยเหลือนี้ - person HartWoom; 07.03.2019

ขอขอบคุณ @Bach Vu และโพสต์นี้: Intent.FLAG_ACTIVITY_FORWARD_RESULT และ PendingIntent ฉันจัดการเพื่อให้ได้สิ่งที่ต้องการโดยใช้การตั้งค่าที่ใช้ร่วมกัน ฉันกำลังเก็บข้อมูลของฉันไว้ในการตั้งค่าที่ใช้ร่วมกันใน ActivityChild และการดึงข้อมูลใน ActivityMain ของฉันโดยใช้การแทนที่ของ onActivityResult

person HartWoom    schedule 07.03.2019