Android: etkinliği yığına kaydetmeden açın


94

2 aktivitem var: Ana ve Liste.

Main'den Listeyi açabilirsiniz; Listeden Main'i açabilirsiniz.

Ben Listesinin her açılış böylece seveceğini değil 'tarih' haline kaydedilmiş olsun. Yani, Main basarak geri edemez Listesine geri dönün.

Mümkün mü?


11
"Liste", "ana" olarak başlarsa, finish()hemen sonra aramasını sağlayın startActivity(...). Bu şekilde, kullanıcı 'ana' dan GERİ düğmesine basarsa, geri dönecek hiçbir şey olmayacaktır.
Squonk

bu, bildirimde gezinme içindir, ancak kavramlar uygulanabilir developer.android.com/guide/topics/ui/notifiers/…
Kevin Lee

Yanıtlar:


160

Listenizi başlatırken Activity, Intentbayraklarını şu şekilde ayarlayın:

Intent i = new Intent(...); // Your list's Intent
i.setFlags(i.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); // Adds the FLAG_ACTIVITY_NO_HISTORY flag
startActivity(i);

FLAG_ACTIVITY_NO_HISTORYBayrak yeni tutar Activitytarih yığınına eklenmesini.

NB: @Sam'ın işaret ettiği gibi, i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);bunun yerine kullanabilirsiniz . İşlevsel bir fark yoktur.


2
Bu yöntem hakkında sadece küçük bir yorum: sadece 2 Aktivite varsa bu mükemmel çalışacaktır. Ancak Aktivite listesi başka bir Aktivite başlatabilirse (üçüncü Aktivite diyelim), üçüncü Aktivitede geri düğmesine basmak Aktivite
VinceFR

Aslında. Ne yazık ki bundan kaçınmanın bir yolu yok. Intent"Sadece başlangıç ​​noktasına dönülmezse tarihe eklenir" şeklinde bir bayrak yoktur Activity.
Eric

1
hayır ancak FLAG_ACTIVITY_NEW_TASK bayrağı işi yapacak, Etkinlik listesi geçmişe eklenecek ancak her zaman en üstte olacak, bu nedenle ana Etkinlikten geri basıldığında etkinlik listesi görüntülenmeyecek
VinceFR

7
Eğer kullanılan belirli bir nedeni var mı setFlags()ile getFlags()yerine Intent.addFlags()?
Sam

1
@VinceFR tam olarak istediğim şey! a -> b -> c ve doğrudan c-
realtebo

90

Manifest dosyasında şunu ekleyin:

android:noHistory="true" 

yığında tutmak istemediğiniz aktiviteye.


no_history bayrağıyla etkinliğe başlamaktan herhangi bir fark var mı?
realtebo

1
Sorunuzda da söylediğiniz gibi, "listenin her açılışı 'geçmişe' KAYDEDİLMEZ" Bu nedenle, uygulamanızı tekrar açtığınızda bu sizi ana faaliyete götürecektir
Marcin S.

@MarsinS. uygulama son uygulama listesinde olmadığında çalışmıyor. Bunun neden olduğunu açıklar mısınız
Ajit Kumar Dubey

1
Öyleyse bu 2 yaklaşım (açık ve işaret) arasındaki fark nedir?
pumbosha

@pumbosha Manifest yaklaşımı, etkinliği her zaman tarihin dışında bırakacaktır. Bayrak yaklaşımı, çalışma zamanında bu davranışı kontrol etmenizi sağlar.
John Crawford

28

Yeni görevi temizleyerek kullanın. Bu, diğer seçenekler olmadığında benim durumumda çalıştı.

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

Tüm geçmiş yığınını temizleyin ve Android'de yeni bir etkinlik başlatın


1
Bu harika olurdu, ancak sistemin kapsamlı "görev değiştirme" animasyonunu durdurmanın bir yolu var mı? FLAG_ACTIVITY_NO_ANIMATION eklemek maalesef bunu engellemez!
androidguy

bu uygulama hızını etkiler mi?
Acauã Pitta

23

Görünüşe göre, başka bir etkinliğinizde bir başkasını açtıktan hemen sonra bitir () çağırırsanız, biten yığın yığından kaldırılır.

Örneğin:

Intent intent = new Intent(this, NextActivity.class);
startActivity(intent);
finish();

Telefonunuz o kadar hızlı değilse, önceki aktivitenin hareket ettiğini göreceksiniz.
Nolan

@Nolan, sadece aktiviteye başlamadan bitirirseniz
Henrik Bøgelund Lavstsen

7

Benim özel durumumda FLAG_ACTIVITY_NO_HISTORYişe yaramadı. Ne yaptım FLAG_ACTIVITY_NEW_TASKya FLAG_ACTIVITY_CLEAR_TASKyalnız kendileri çalışması ile.

Ancak FLAG_ACTIVITY_NEW_TASKve FLAG_ACTIVITY_CLEAR_TASKbirlikte çalıştı.

Intent intent = new Intent(FooActivity.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

4

Geç cevap, ancak diğer cevaplara biraz derinlik katıyor. Her şey, o aktiviteden başlatılan diğer aktivitelerle ne olmasını istediğinize bağlıdır.

Seçenek 1 - Yalnızca bu tek etkinlikte arama etkinliği geçmişi olmamalıdır

O zaman yap:

Intent i = new Intent(...);
i.addFlag(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(i);

Seçenek 2 - Bu belirli faaliyetten başlatılan tüm faaliyetlerin geçmişi olmamalıdır

Ardından arama faaliyetinin manifestini ekleyin:

android:noHistory="true" 

Ancak yeni aktivitede geçmişe sahip olmak istiyorsanız, bayrağı manuel olarak kaldırmanız gerekir:

Intent i = new Intent(...);
i.removeFlag(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(i);

Umarım bu diğer cevapları temizler :)


3

Kotlin'de bunu yapmanın bir yolunu eklemek istedim:

val i = Intent(this, LogInActivity::class.java)
startActivity(i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK))

2
Kotlin yönteminden daha fazlası: Intent(this, MainActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) }.also { startActivity(it) }
4ndro1d

2

Etkinlik zaten devam ediyorsa FLAG_ACTIVITY_CLEAR_TOP'u deneyin:

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);


-4

'Dönüş' işlevini durdurmak için belirli bir etkinlikteki geri düğmesini geçersiz kılamaz mısınız?

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {

        return true;
    }
    return super.onKeyDown(keyCode, event);
}

6
Bunu yapma. BACK'i belirli amaçlar için kesmek kabul edilebilir, ancak bunu sadece BACK baskısını sessizce tüketmek ve bir işlemin sonlandırılmasını önlemek Activityiyi bir uygulama değildir.
Squonk

1
Tamamen kabul ediyorum ^ sadece bir seçenek.
Broak

1
Bunun OnBackPressediçin var.
Fred
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.