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_CANCELED
segera 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?
sumber
singleTop
tampaknya baik untuk saya,singleTask
namun menyebabkan masalah ini dan karenanyasingleInstance
pasti akan melakukannya jugaSelain itu pastikan niatnya tidak memiliki
Intent.FLAG_ACTIVITY_NEW_TASK
set.Dari dokumen :
sumber
Intent.FLAG_ACTIVITY_NEW_TASK
?Saya telah melihat perilaku ini sebelumnya, pastikan aktivitas destnation Anda (aktivitas khusus itu) tidak ada
singleInstance
di file AndroidManifest. Jika ActivitysingleInstance
, maka akan kembaliRESULT_CANCELED
sebelum diluncurkan!sumber
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_TASK
ditambahkan 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.
sumber
startActivityForResult()
tidak bekerja dengansingleInstance
atausingleTask
aktivitas di versi Android pra-lolipop. Karena Android 5 berfungsi (lihat jawaban ini untuk lebih jelasnya).sumber
Ini juga memicu jika Anda memiliki
FLAG_ACTIVITY_NEW_TASK
niat Anda.sumber
Masalah saya adalah dengan aktivitas menelepon. Deklarasi di AndroidManifest memiliki properti berikut:
Mengubahnya menjadi "false" dan sekarang berfungsi dengan baik.
sumber
Android 4.4 memiliki masalah kecil tentang menunggu pengembalian di akhir penutupan aktvitas Untuk mengatasi perilaku ini, penting untuk mengatur:
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
sumber
Juga, periksa apakah android: noHistory = "true" pada aktivitas di Manifest, jika ya, itu tidak akan berfungsi.
sumber
Untuk
ActivityGroup
atauTabHost
dan orang lain, mungkin ituxxxActivity
adalahsubActivity
dari orang tuanya. MakastartActivityForResult
tidak bisa bekerja tetapi orang tua bisa mendapatkan hasilnya.panggilan
getParent().startActivityForResult()
dari sub kegiatan Andaorang tua Anda
ActivityGroup
akan dapat menanganionActivityResult
. Jadi saya membuat subkelasActivityGroup
dan menangani inionActivityResult
.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 menambahkanhandleActivityResult(requestCode, resultCode, data)
subclass ituActivityGroup
untuk panggilan.contoh: http://www.cnblogs.com/relinson/archive/2012/03/25/startActivityForResult.html
sumber
onActivityResult()
juga akanRESULT_CANCELED
dianggap sebagairesultCode
jika Anda salah mengeja paket atau nama kelas dalam file manifes.sumber
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);
sumber
Jika Anda mendefinisikan
android:noHistory="true"
aktivitas di AndroidManifest.xml Anda, itu akan menyebabkan masalah yang sama di sini.sumber