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?

Panggilan balik Eugene Mayevski
sumber
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.

Panggilan balik Eugene Mayevski
sumber
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);.

TPG
sumber
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.

Felipe
sumber
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 .)

Sam
sumber
-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.

optimis
sumber
Kelas MyConfigure TIDAK selesai, tebakan Anda salah, maaf. Jika ya, tidak akan ada pertanyaan
Panggilan balik Eugene Mayevski