2011-02-15 20 views
21

A, B, C, D adlı etkinlikleri içeren bir uygulama olduğunu varsayalım. Şimdi, A'nu kök aktivitesi olarak başlattık ve A, B'den başlatıldı ve B, B'den başlatıldı ve C, C'den başlatıldı. Şimdi, D faaliyetinde "Kaldır" adlı bir düğmem var. D aktivitesinde "Kaldır" düğmesine bastığımda, B etkinliği ve C etkinliği de geçmiş yığınından kaldırılmalıdır. On (Geri) tuşuna basarak D aktivitesinden geri tuşuna basmanız gerekir. Bunun yerine C'yi nasıl aktive edeceğimi bilmiyorum. Bu sorunu çözmeme yardımcı olan var mı?Yığın geçmişinden belirli etkinlikleri nasıl temizlerim?

cevap

29

Ben doğrudan programlı geçmişinden faaliyetlerini kaldırabilir emin değilim ama startActivityForResult() yerine startActivity() kullanırsanız, sonra faaliyetinden dönüş değerine bağlı olarak, daha sonra hemen finish() öncel aktivite davranışını simüle etmek için İstediğiniz. Tüm aktivitelerinizde bu yöntemi kullanarak, etkinlik D olayından etkinlik A'ya gitmenize izin vermek için etkinlik yığınının basamaklandırılmasını sağlayabilirsiniz. Bu durumun sizin durumunuz olmadığını biliyorum, ancak daha önce biliyorsanız selefinin kalmasını istemediğiniz aktiviteyi başlatırsanız, startActivity()'dan hemen sonra finish()'u arayabilirsiniz.

Common Tasks and How to do Them in Android Ben @RivieraKid katılıyorum

+0

Geçerli etkinliğin yığında kalmaması için, bitirme çağrısının() hemen startActivity() öğesinden hemen sonra çağrılması çok yararlıdır. Teşekkürler. – dazed

19

"Yeni Ekran ömrü" olarak adlandırılan bölümüne bakın ama başka yol düşünemiyorum edin: Eğer gerçek bir özel bayrak set "Kaldır" düğmesine bastığınızda.

public void onBackPressed() { 
    if (!remove){ 
    super.onBackPressed(); 
    }else{ 
    Intent goToA = new Intent((this,ActivityA.class);); 
    goToA.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    startActivity(goToA); 
    } 
} 

sen istediğin bu mu sence:

geri anahtar olay geçersiz kılar

?

İyi şanslar.

+2

Flag Intent.FLAG_ACTIVITY_CLEAR_TOP çalışıyor. Teşekkürler. – anticafe

+0

Benim için de çalışıyordu. – AB1209

+0

teşekkürler yaar ........ benim için çalışıyor – GvSharma

0

Bence bu istediğini yapardı. Bildiri dosyasında, "B" ve "C" etkinliklerine "no" adlı "öznitelik" özniteliğini ekleyin ve geri düğmesini "D" ye geri getirerek yeniden ziyaret etmeyin.

<activity android:name="com.acme.activityA"></activity> 

    <activity android:name="com.acme.activityB" 
       android:noHistory="true"></activity> 

    <activity android:name="com.acme.activityC" 
       android:noHistory="true"></activity> 

    <activity android:name="com.acme.activityD"></activity> 
0

Bir alternatif, etkinliklere erişim sahibi olmak ve bunları kapatmak için bir sınıf oluşturur. Örnek:

Etkinlikler:

  • ger1
  • ACT2
  • Act3

Kontrol sınıfı: her bir faaliyetin onCreate yılında

public class ActivitiesControl { 

    public static act1 vAct1 = null; 
    public static act2 vAct2 = null; 
    public static act3 vAct3 = null; 
} 

ayarladığınız: ActivitiesControl.vAct1 = bu;

ve onDestroy(): ActivitiesControl.vAct1 = boş; Eğer stackHistory kaldırmak için bazı etkinlikler yok etmek istediğinizde

sadece çağrı:

ActivitiesContro.vAct1.finish();

Bunun en iyi yöntem olup olmadığını bilmiyorum, ama benim için işe yarayan şey. Uygulamayı başlattığınızda

+2

rly kötü bir fikir bellek sızıntısı muhtemelen meydana gelecektir –

1

. Tüm aktiviteler varsayılan olarak aynı görevde başlatılır. Böylece arka yığıt aşağıdaki gibi görünüyor.

Görev: A-> B-> C-> arka yığının TOP Şimdi "D"

işaret ediyor bu durumda D zaman "A" tekrar TOP noktayı istiyorum . Sadece senin kadar zamanki gibi etkinlik başlatma etkinlik "D" "düğmesini kaldırmak" bastığınızda Hemen AndroidManifest.xml Şimdi

aktivite "A" için öznitelik

android:launchMode="singleTask" 

beyan yap. arka yığın faaliyeti "B" ve "C" nin temizlenir ve Sen "A"

aramıyorsun bile bu bellekten adresinin etkinlik D kapatın ve yok edecek hatırla etkinliğinden temiz bir başlangıç ​​olsun finish() açıkça "D" içinde

İlgili konular