Android - startActivityForResult segera memicu padaActivityResult

144

Saya meluncurkan aktivitas dari aktivitas utama di aplikasi saya menggunakan panggilan startActivityForResult(intent, ACTIVITY_TYPE), dan semuanya berfungsi kecuali satu.

Yang ini, ketika dipanggil, meluncurkan aktivitas seperti yang diinginkan, tetapi dalam log saya bisa melihat bahwa onActivityResult()itu segera dipicu. Aktivitas muncul tetapi RESULT_CANCELEDsegera dikembalikan ke onActivityResult().

Saya kemudian berinteraksi dengan aktivitas, tekan tombol yang memanggil finish(), dan onActivityResult()tidak dipanggil saat ini (karena ternyata hasilnya telah dikembalikan).

Apakah ini masuk akal bagi siapa pun? Adakah yang pernah melihat perilaku ini sebelumnya?

TomBomb
sumber

Jawaban:

315

Anda tidak dapat menggunakan startActivityForResult()jika aktivitas Anda diluncurkan sebagai singleInstanceatau singleTask. standardatau singleTopmode peluncuran akan memperbaiki masalah.

Falmarri
sumber
2
Terima kasih Anda berdua, saya memiliki ini di file manifes saya dan benar-benar lupa tentang hal itu
TomBomb
9
WOW! Ini sepertinya hal yang jelas untuk ditambahkan ke javadocs! Saya menghabiskan sepanjang malam untuk mencoba ini, dan jawaban ini mengingatkan saya bahwa Aktivitas saya ditetapkan untuk singleTop.
swooby
20
singleToptampaknya baik untuk saya, singleTasknamun menyebabkan masalah ini dan karenanya singleInstancepasti akan melakukannya juga
darnmason
4
Saya juga menghabiskan terlalu lama men-debug ini! Terima kasih!!
suomi35
4
Dalam kasus saya, tidak mendefinisikan kelas sebagai singleInstance atau singleTop, tetapi masih terjadi ... ada saran?
CoDe
110

Selain itu pastikan niatnya tidak memiliki Intent.FLAG_ACTIVITY_NEW_TASKset.

Dari dokumen :

Bendera ini tidak dapat digunakan saat pemanggil meminta hasil dari aktivitas yang diluncurkan.

James Zhang
sumber
3
Ini memperbaiki masalah dalam kasus saya. Masalahnya bukan disebabkan oleh singleInstance, singleTop atau singleTask.
Diana
Anda adalah mint (penyelamat hidup). Ini adalah masalah persis saya ketika saya ingin pengguna untuk menangkap gambar dalam Fragmen
kyay
@Diana, apakah Anda ingat yang Anda gunakan bukan Intent.FLAG_ACTIVITY_NEW_TASK?
Keselme
@ Selesme Maaf, sudah lama, saya berharap saya bisa membantu tetapi saya tidak ingat dan saya tidak dapat mengakses kode itu lagi.
Diana
Ya, perbaiki. startActivityForResult tidak boleh digunakan dengan Intent.FLAG_ACTIVITY_NEW_TASK
hanilozmen
21

Saya telah melihat perilaku ini sebelumnya, pastikan aktivitas destnation Anda (aktivitas khusus itu) tidak ada singleInstancedi file AndroidManifest. Jika Activity singleInstance, maka akan kembali RESULT_CANCELEDsebelum diluncurkan!

pangcong
sumber
18

Saya juga ingin menambahkan bahwa Anda dapat memanggil aplikasi eksternal dengan:
Intent in = caller.getPackageManager().getLaunchIntentForPackage("com.your.package.here");
Yang akan membuat maksud dengan Intent.FLAG_ACTIVITY_NEW_TASKditambahkan secara default, jadi panggil:
in.setFlags(0);
Yang akan menghapus bendera itu, dan kemudian Anda dapat melanjutkan ke:startActivityForResult(in, action);

Alasan saya melakukan ini adalah karena saya memiliki aplikasi utilitas yang memiliki fungsi umum antara beberapa aplikasi lain dan saya dapat menyimpan perubahan kode ke satu lokasi alih-alih mengkhawatirkan beberapa pembaruan.

giannileuani
sumber
Saya tahu ini sudah tua, tetapi ini benar-benar tak ternilai bagi saya sehingga saya ingin mengucapkan terima kasih kepada pengguna, dan menunjukkan kepada siapa pun yang melompat di antara aktivitas bahwa ini adalah emas yang aneh! Menyelamatkan pantatku selama hackathon;)
Wes Winn
Inilah yang perlu lebih diperhatikan. Ini adalah solusi terbaik dan bekerja dengan sempurna untuk saya. Anda menghemat banyak waktu, terima kasih banyak.
Aritra Roy
Pilih ini jawaban karena ini adalah masalah yang tepat saya alami pagi ini! Terima kasih atas solusinya!
Will Johnson
Terima kasih. intent.setFlags (0) menyelesaikan masalah. Sekarang aplikasi kedua mulai ok dan mengembalikan hasilnya ke aplikasi panggilan
Niaz
5

startActivityForResult()tidak bekerja dengan singleInstanceatau singleTaskaktivitas di versi Android pra-lolipop. Karena Android 5 berfungsi (lihat jawaban ini untuk lebih jelasnya).

Noelicus
sumber
5

Ini juga memicu jika Anda memiliki FLAG_ACTIVITY_NEW_TASKniat Anda.

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(intent, REQUEST_CODE);
Roger Alien
sumber
Terima kasih. Saya menambahkan FLAG_ACTIVITY_NEW_TASK dalam aktivitas saya.
Chirag Savsani
1

Masalah saya adalah dengan aktivitas menelepon. Deklarasi di AndroidManifest memiliki properti berikut:

android:noHistory="true"

Mengubahnya menjadi "false" dan sekarang berfungsi dengan baik.

pengguna3829751
sumber
1

Android 4.4 memiliki masalah kecil tentang menunggu pengembalian di akhir penutupan aktvitas Untuk mengatasi perilaku ini, penting untuk mengatur:

  • semua kegiatan akan memiliki atribut tugas Affinity yang sama . ( TaskAffinity = "[SAME STRING]")
  • launchmode=singleTop,
  • launchIntent.SetFlags(0); // for reset default Intent flags if you launch from package manager

Solusi ini bekerja dengan semua versi Android

Lihat ini untuk taskAffinity: https://asyoulook.com/computers%20&%20internet/android-onactivityresult-being-called-instantly/1004072

Andrea Falappi - Polipo
sumber
1

Juga, periksa apakah android: noHistory = "true" pada aktivitas di Manifest, jika ya, itu tidak akan berfungsi.

Sanju
sumber
0

Untuk ActivityGroupatau TabHostdan orang lain, mungkin itu xxxActivityadalah subActivitydari orang tuanya. Maka startActivityForResulttidak bisa bekerja tetapi orang tua bisa mendapatkan hasilnya.

  1. panggilan getParent().startActivityForResult()dari sub kegiatan Anda

  2. orang tua Anda ActivityGroupakan dapat menangani onActivityResult. Jadi saya membuat subkelas ActivityGroupdan menangani ini onActivityResult.

  3. Anda dapat merutekan ulang hasil itu kembali ke sub-aktivitas jika perlu. Dapatkan aktivitas saat ini dengan getLocalActivityManager().getCurrentActivity(). Sub kegiatan saya mewarisi dari aktivitas kustom jadi saya menambahkan handleActivityResult(requestCode, resultCode, data)subclass itu ActivityGroupuntuk panggilan.

contoh: http://www.cnblogs.com/relinson/archive/2012/03/25/startActivityForResult.html

fantaxy025025
sumber
Apa pendapat Anda tentang kasus khusus ini ketika memanggil browser web default: codeproject.com/Questions/990063/…
Ahmad Ebrahimi
0

onActivityResult()juga akan RESULT_CANCELEDdianggap sebagai resultCodejika Anda salah mengeja paket atau nama kelas dalam file manifes.

musterjunk
sumber
0

Di Android Manifest set android:launchMode="singleTop"untuk aktivitas yang Anda ingin buka dengan hasil dan saat membuka flag set aktivitasintent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

Krish
sumber
0

Jika Anda mendefinisikan android:noHistory="true"aktivitas di AndroidManifest.xml Anda, itu akan menyebabkan masalah yang sama di sini.

Yu-Long Chen
sumber