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?

Jawaban:


315

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


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.


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!


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.


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


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

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.


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


1

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


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


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.


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


0

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

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.