onActivityResult () erken çağrıldı


92

İşçi faaliyetimden Activity(soyundan gelen PreferenceActivity) şu şekilde başlıyorum :

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

MyConfiguresınıfın herhangi bir setResult()çağrısı YOKTUR . Aslında, MyConfiguresınıfın, OnCreate()kullanarak tercihleri ​​yüklediği yer dışında herhangi bir kodu yoktur addPreferencesFromResource.

Şimdi onActivityResultile çağrılır requestCodearasında 1458hemen sonra, erken MyConfigureetkinlik çalıştırılır. 1.6 ve 2.1 emülatörlerinde ve 2.1 cihazda test edilmiştir. setResult()İçinde bir yere gömülmek için bir çağrı var mı PreferenceActivity? Ya da bu erken çağrı başka nasıl açıklanabilir?


1
Bir aktivite setResults () ile bitmez, finish () ile biter. MyConfigure etkinliğinizin onCreate yöntemini gösterebilir misiniz?
Cheryl Simon

Doğru değil. Ancak, bir şey önceden setResult () 'u çağırıyor ve merak ediyorum, ne olduğunu. OnCreate kodu önemsizdir: genel sınıf MyConfigure PreferenceActivity'yi genişletir {@Override korumalı void onCreate (Bundle SavedInstanceState) {super.onCreate (SavedInstanceState); addPreferencesFromResource (R.xml.preferences); }}
Eugene Mayevski'nin Geri Dönüşü

setResult'un çağrıldığını nasıl bileceksiniz?
RoflcoptrException

Soruyu tam olarak bunun için yarattım. OnActivityResult'un neden erken çağrıldığını öğrenmek için.
Eugene Mayevski'nin Geri Dönüşü

Bu dönemde logcat çıktısı ne diyor? Özellikle, hangi Amaçların çağrıldığını gösteren "ActivityManager" etiketi.
Christopher Orr

Yanıtlar:


256

Bu, başlatma modunu şu şekilde değiştirerek giderilir singleTop:

    <activity
        android:name=".MainActivity"
        android:launchMode="singleTop">

İçin (henüz belirlenmedi) hemen sonuç rapor Android, bir hata / özellik (?) Var Activity, ilan singleTask(etkinlik çalışmaya devam olmasına rağmen). Biz değiştirirseniz launchModegelen ana faaliyet singleTaskiçin singleTop, her şeyin beklendiği gibi çalışır - Sonuç faaliyeti bittikten sonra raporlanır. Bu davranışın belirli bir açıklaması olsa da (yalnızca bir singleTasketkinlik olabilir ve bunun için birden fazla garson olabilir), bu benim için hala mantıksal bir kısıtlama değil.


2
Böcek gibi görünüyor! ^^ çok tuhaf davranış!
Felipe

7
Aktivitenin tek görev başlatma modu varsa, onActivityResult kullanarak alt aktivitelerden sonuç alması gerekmez. Alt aktiviteler sadece finish () 'yi çağırır ve ardından veri niyetiyle ana aktiviteyi başlatır. Ana aktivitede onNewIntent yöntemini geçersiz kılmanız ve alınan amacı işlemeniz gerekir.
Nik

43
launchMode = "singleInstance" da bu davranışa neden oluyor
ffleandro

1
Görünüşe göre bu benim için işe yaramadı, ebeveyn aktivitesinde singleTop'u denedim ama boşuna. Ayrıca niyet işaretini FLAG_ACTIVITY_SINGLE_TOP olarak ayarladım, ancak istek artık doğru değeri gösteriyor ancak sonuç her zaman 0.
Neon Warge

11
Kitkat 4.4.4'te oluyor, Lolipop'ta olmuyor.
Somasundaram Mahesh

19

Aramadan intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);önce çıkardıktan sonra sorunumu çözdüm fragment.startActivityForResult(intent, 0);.


1
Teşekkür ederim! Bu benim sorunumu çözdü. Bunun bir yerde bir açıklaması var mı?
Conner Harkness

Bu günlerde bayrakla ilgili belgelerde bunun için bir açıklama var "Bu bayrak, arayan kişi başlatılan etkinlikten bir sonuç istediğinde kullanılamaz". Peki bu bir açıklama değil ama en azından bir uyarı!
Code Novitiate

5

Tüm özel "android: launchMode" umu Aktivitemden kaldırdım ve her şey bir cazibe gibi çalıştı. Android'in tam olarak ne anladığını bilmediğinizde bunu değiştirmek iyi bir fikir değildir ... Android bu şekilde biraz karmaşıktır.


1

Bu, niyetin Intent.FLAG_RECEIVER_FOREGROUNDbayrağı koyduğu zaman başıma geldi .

(Evet, bu bayrak faaliyetle ilgili değil, ancak farklı bir soruna yönelik av tüfeği çözümünün bir parçası olarak tüm niyetimde vardı .)


-1

Yine Mayra'nın yorumunda olduğu gibi, setResult()sorununuzla hiçbir ilgisi yok. Bazı nedenlerden dolayı, MyConfiguresınıf kendini bitirir ve bu olduğunda PreferenceActivitysadece bir sonucun olabileceğini varsayar, MyConfigureçünkü kodu böyle yazdığınızdan.

bu aynı zamanda startActivityForResult()... ile başlayan herhangi bir etkinliği geri zorladığınızda da olur .

Bu yüzden, dersinizin neden MyConfigurezorla bitirildiğine odaklanmanın daha iyi olacağını düşünüyorum .


MyConfigure sınıfı bitmiyor, tahminleriniz yanlış, üzgünüm. Öyle olsaydı, hiçbir soru
kalmazdı
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.