Android - startActivityForResult hemen onActivityResult'u tetikliyor


147

Aramayı kullanarak uygulamamdaki ana etkinlikten etkinlikler başlatıyorum startActivityForResult(intent, ACTIVITY_TYPE)ve hepsi çalışıyor.

Bu, çağrıldığında, etkinliği istendiği gibi başlatır, ancak günlükte onActivityResult()bunun hemen tetiklendiğini görebiliyorum. Aktivite ortaya çıkar, ancak RESULT_CANCELEDhemen geri döner onActivityResult().

Daha sonra etkinlik ile etkileşime girerim, çağıran finish()ve onActivityResult()bu sefer çağrılmayan bir düğmeye basıyorum (çünkü görünüşe göre bir sonuç zaten döndürülmüştür).

Bu kimseye mantıklı geliyor mu? Bu davranışı daha önce gören oldu mu?

Yanıtlar:


318

startActivityForResult()Aktiviteniz bir singleInstanceveya olarak başlatılıyorsa kullanamazsınız singleTask. standardveya singleTopbaşlatma modu sorunu çözecektir.


2
İkinize de teşekkür ederim, bunu manifest
dosyamda buldum

9
VAOV! Bu, javadoc'lara eklenmesi gereken bariz bir şey gibi görünüyor! Bunu çalıştırmaya çalışırken bütün bir akşamı harcadım ve bu SO cevabı bana Aktivitemin singleTop olarak ayarlandığını hatırlattı.
swooby

20
singleTopbenim için iyi görünüyor, singleTaskancak bu soruna neden oluyordu ve bu yüzden singleInstancekesinlikle yapacaktı
darnmason

4
Ayrıca bunu hata ayıklamak için çok uzun zaman harcadım! Teşekkürler!!
suomi35

4
Benim durumumda, herhangi bir sınıfı singleInstance veya singleTop olarak tanımlamadım, ama yine de oluyor ... herhangi bir öneri?
CoDe

111

Ek olarak, amacın Intent.FLAG_ACTIVITY_NEW_TASKkümeye sahip olmadığından emin olun .

Gönderen docs :

Bu bayrak, arayan kişi başlatılan etkinlikten bir sonuç istediğinde kullanılamaz.


3
Bu benim durumumdaki sorunu çözdü. Soruna singleInstance, singleTop veya singleTask neden olmadı.
Diana

Sen bir nane'sin (Bir hayat kurtarıcı). Kullanıcının bir Fragment içinde bir görüntü
çekmesini

@Diana, yerine ne kullandığını hatırlıyor musun Intent.FLAG_ACTIVITY_NEW_TASK?
Keselme

@Keselme Üzgünüm, uzun zaman oldu, keşke yardım edebilseydim ama hatırlamıyorum ve artık o koda erişemiyorum.
Diana

Evet, düzeltildi. startActivityForResult, Intent.FLAG_ACTIVITY_NEW_TASK ile kullanılmamalıdır
hanilozmen

21

Bu davranışı daha önce görmüştüm, lütfen hedef etkinliğinizin (o özel etkinlik) singleInstanceAndroidManifest dosyasında olmadığından emin olun . Etkinlik singleInstanceöyleyse, RESULT_CANCELEDbaşlatılmadan önce geri dönecektir !


18

Ayrıca, harici bir uygulamayı şu şekilde çağırabileceğinizi de eklemek isterim:
Intent in = caller.getPackageManager().getLaunchIntentForPackage("com.your.package.here");
Bu, Intent.FLAG_ACTIVITY_NEW_TASKvarsayılan olarak eklenen bir amaç oluşturur , öyleyse arayın:
in.setFlags(0);
Hangisi bu bayrağı temizler ve sonra devam edebilirsiniz:startActivityForResult(in, action);

Bunu yapmamın nedeni, birkaç başka uygulama arasında ortak işlevselliğe sahip bir yardımcı program uygulamam olması ve kod değişikliklerini birden çok güncelleme hakkında endişelenmek yerine tek bir konumda tutabilmem.


Bunun eski olduğunu biliyorum, ama bu benim için kesinlikle paha biçilemezdi ki, kullanıcıya teşekkür etmek ve aktiviteler arasında atlayanlar için bunun inanılmaz bir altın olduğunu söylemek istedim! Hackathon sırasında kıçımı kurtardı;)
Wes Winn

Daha fazla dikkat edilmesi gereken şey bu. En iyi çözüm ve benim için mükemmel çalışıyor. Bana çok zaman kazandırdın, çok teşekkür ederim.
Aritra Roy

Bu sabah yaşadığım sorun tam olarak bu olduğu için bu yanıta oy vermek! Çözüm için teşekkürler!
Will Johnson

Teşekkürler. intent.setFlags (0) sorunu çözdü. Şimdi ikinci uygulama düzgün şekilde başlar ve arama uygulamasına sonuç döndürür
Niaz

5

startActivityForResult()Android'in lolipop öncesi sürümündeki bir singleInstanceveya singleTasketkinliğiyle çalışmaz . Android 5'ten beri çalışıyor ( daha fazla ayrıntı için bu yanıta bakın).


5

Ayrıca FLAG_ACTIVITY_NEW_TASKniyetiniz varsa tetikler .

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(intent, REQUEST_CODE);

Teşekkürler. Etkinliğime FLAG_ACTIVITY_NEW_TASK ekledim.
Chirag Savsani

1

Benim sorunum arama etkinliğiydi. AndroidManifest'teki beyanı aşağıdaki özelliğe sahipti:

android:noHistory="true"

"Yanlış" olarak değiştirildi ve şimdi iyi çalışıyor.


1

Android 4.4'ün, etkinlik kapanışının sonunda geri dönüşü beklemeyle ilgili küçük bir sorunu var Bu davranışı çözmek için aşağıdakileri ayarlamak önemlidir:

  • tüm etkinlikler aynı görev Affinity özniteliğine sahip olacaktır . ( TaskAffinity = "[SAME STRING]")
  • launchmode=singleTop,
  • launchIntent.SetFlags(0); // for reset default Intent flags if you launch from package manager

Bu çözüm, Android'in tüm sürümleriyle çalışır

TaskAffinity için buna bakın: https://asyoulook.com/computers%20&%20internet/android-onactivityresult-being-called-instantly/1004072


1

Ayrıca, Manifest'teki etkinlikte android: noHistory = "true" olup olmadığını kontrol edin, evet ise çalışmayacaktır.


0

İçin ActivityGroupya TabHostve diğerleri, belki xxxActivitybir olduğunu subActivityüst biriminin. O zaman startActivityForResultçalışamaz ama ebeveyn sonucu alabilir.

  1. call getParent().startActivityForResult()senin alt aktivitesinden

  2. ebeveyniniz ( ActivityGroup) onActivityResult,. Bu yüzden bir alt sınıf oluşturdum ActivityGroupve bununla uğraştım onActivityResult.

  3. Gerekirse bu sonucu tekrar alt aktiviteye yönlendirebilirsiniz. Şu anki aktiviteyi ile al getLocalActivityManager().getCurrentActivity(). Alt etkinliklerim özel bir etkinlikten devralır, bu nedenle arama handleActivityResult(requestCode, resultCode, data)için o alt sınıfa bir ekledim ActivityGroup.

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


Varsayılan web tarayıcısını ararken bu özel durum hakkında ne düşünüyorsunuz: codeproject.com/Questions/990063/…
Ahmad Ebrahimi

0

onActivityResult()Ayrıca geçecek RESULT_CANCELEDşekilde resultCodesize manifest dosyasında paket veya sınıf adı yanlış yazarsanız.


0

Android Manifest setinde android:launchMode="singleTop"sonuçla açılmasını istediğiniz aktivite için ve aktivite seti bayrağını açarkenintent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);


0

android:noHistory="true"AndroidManifest.xml dosyanızdaki aktivitede tanımladıysanız , burada da aynı soruna neden olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.