onActivityResult () dipanggil sebelum waktunya


92

Saya memulai Activity(turunan PreferenceActivity) dari aktivitas pekerja saya sebagai berikut:

@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);
}

MyConfigurekelas TIDAK memiliki setResult()panggilan apapun . Faktanya, MyConfigurekelas tidak memiliki kode apa pun kecuali di OnCreate()mana ia memuat preferensi menggunakan addPreferencesFromResource.

Sekarang onActivityResultdisebut dengan requestCodedari 1458prematur, tepat setelah MyConfigureaktivitas dijalankan. Diuji pada emulator 1.6 dan 2.1 serta 2.1. Apakah ada panggilan untuk setResult()dimakamkan di suatu tempat PreferenceActivity? Atau bagaimana lagi panggilan prematur ini bisa dijelaskan?


1
Sebuah aktivitas tidak berakhir pada setResults (), itu berakhir pada finish (). Dapatkah Anda menunjukkan metode onCreate dari aktivitas MyConfigure Anda?
Cheryl Simon

Benar, tidak. Namun, ada sesuatu yang memanggil setResult () sebelumnya dan saya bertanya-tanya, apa itu. Kode onCreate itu sepele: kelas publik MyConfigure extends PreferenceActivity {@Override protected void onCreate (Bundle storedInstanceState) {super.onCreate (storedInstanceState); addPreferencesFromResource (R.xml.preferences); }}
Panggilan balik Eugene Mayevski

bagaimana menurut Anda untuk mengetahui bahwa setResult dipanggil?
RoflcoptrException

Untuk itulah saya membuat pertanyaan itu. Untuk mencari tahu, mengapa onActivityResult dipanggil sebelum waktunya.
Panggilan balik Eugene Mayevski

Apa yang dikatakan keluaran logcat sekitar periode ini? Secara khusus, tag "ActivityManager", yang menunjukkan Intent mana yang dipanggil.
Christopher Orr

Jawaban:


254

Ini diperbaiki dengan mengubah mode peluncuran ke singleTop:

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

Ada bug / fitur (?) Di Android, yang langsung melaporkan hasil (yang belum disetel) untuk Activity, dideklarasikan sebagai singleTask(terlepas dari fakta bahwa aktivitas terus berjalan). Jika kita mengubah launchModeaktivitas induk dari singleTaskmenjadi singleTop, semuanya berfungsi seperti yang diharapkan - hasil hanya dilaporkan setelah aktivitas selesai. Meskipun perilaku ini memiliki penjelasan tertentu (hanya satu singleTaskaktivitas yang dapat ada dan dapat terjadi beberapa pelayan untuk itu), ini masih bukan batasan logis bagi saya.


2
Sepertinya bug! ^^ perilaku yang sangat aneh!
Felipe

7
Jika aktivitas memiliki mode peluncuran singleTask, aktivitas tidak perlu menerima hasil dari sub-aktivitas menggunakan onActivityResult. Sub aktivitas cukup memanggil finish () lalu memulai aktivitas utama dengan maksud data. Dalam aktivitas utama, Anda harus mengganti metode onNewIntent dan memproses maksud yang diterima.
Nik

43
launchMode = "singleInstance" juga menyebabkan perilaku ini
ffleandro

1
Sepertinya ini tidak berhasil untuk saya, saya mencoba singleTop pada aktivitas orang tua tetapi tidak berhasil. Saya juga menyetel bendera maksud ke FLAG_ACTIVITY_SINGLE_TOP, meskipun permintaan sekarang menunjukkan nilai yang benar tetapi hasilnya selalu 0.
Neon Warge

11
itu terjadi di Kitkat 4.4.4, tidak terjadi di Lolipop.
Somasundaram Mahesh

18

Saya memecahkan masalah saya setelah menghapus intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);sebelum menelepon fragment.startActivityForResult(intent, 0);.


1
Terima kasih! Ini memecahkan masalah saya. Apakah ada penjelasan untuk ini di suatu tempat?
Conner Harkness

Ada penjelasan tentang hal ini di dokumen untuk flag hari ini "Flag ini tidak dapat digunakan saat pemanggil meminta hasil dari aktivitas yang diluncurkan". Yah itu bukan penjelasan tapi setidaknya peringatan!
Kode Novisiat

5

Saya baru saja menghapus semua "android: launchMode" kustom saya dari Aktivitas dan semuanya bekerja dengan sangat baik. Bukan ide yang baik untuk mengubahnya jika Anda tidak tahu PERSIS apa yang dipahami Android ... Android agak rumit dengan cara ini.


1

Ini terjadi pada saya ketika maksud Intent.FLAG_RECEIVER_FOREGROUNDmengatur bendera.

(Ya, bendera itu tidak terkait dengan aktivitas, tetapi saya memilikinya sesuai maksud saya sebagai bagian dari solusi senapan untuk masalah yang berbeda .)


-1

Sekali lagi seperti dalam komentar Mayra, setResult()tidak ada hubungannya dengan masalah Anda. untuk beberapa alasan, MyConfigurekelas selesai dengan sendirinya dan ketika itu terjadi PreferenceActivityhanya mengasumsikan bahwa mungkin ada hasil dari MyConfigurekarena itulah cara Anda menulis kode.

ini juga terjadi ketika Anda memaksa kembali aktivitas apa pun yang dimulai dengan startActivityForResult()...

Jadi, saya pikir lebih baik fokus pada mengapa MyConfigurekelas Anda diselesaikan secara paksa.


Kelas MyConfigure TIDAK selesai, tebakan Anda salah, maaf. Jika ya, tidak akan ada pertanyaan
Panggilan balik Eugene Mayevski
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.