Soru Bir etkinliği geçmiş yığınından kaldırma


Uygulamam, kullanıcının uygulamayı ilk kez çalıştırdığı bir kayıt etkinliği gösterir, şöyle görünür:

  1. ActivitySplashScreen (oyuna hoş geldiniz, bir hesap için kaydolun)
  2. ActivitySplashScreenSignUp (harika, bu bilgiyi doldurun)
  3. ActivityGameMain (ana oyun ekranı)

Böylece, kullanıcılar her ekrandaki bir düğmeyi tıkladığında, etkinlikler tam olarak bu sırada başlar.

Kullanıcı # 2'den # 3'e geçtiğinde, # 1 ve # 2'yi tarih yığınından tamamen silmek mümkün mü? Kullanıcı 3. sıradaysa ve arka tuşa bastığında, ekrana geri dönmek yerine ekrana giderler.

Bunu görevleri ile başarabileceğimi düşünüyorum (ör. # 3'te yeni bir görev başlat) ancak daha basit bir yöntem olup olmadığını görmek istedim.

Teşekkürler


344
2017-12-14 04:15


Menşei


Ana ekrandayken, kullanıcı uygulamanızı tekrar başlattığında onu ActivitySplashScreen veya ActivityGameMain'e götürür mü? - Tamil


Cevaplar:


Bunu ayarlayarak bunu başarabilirsiniz. android:noHistory nitelik için "true" ilgili <activity> içinde girişler AndroidManifest.xml dosya. Örneğin:

<activity
    android:name=".AnyActivity"
    android:noHistory="true" />

583
2017-12-07 12:32



Bunu yapmanın en iyi yolu budur. - shkschneider
Eşdeğer kullanabilirsiniz FLAG_ACTIVITY_NO_HISTORY. - Timmmm
Bunu koddan nasıl yapabilirim? Çünkü bunu her zaman yapmak istemiyorum. Belirli bir aktiviteyi yalnızca bazı koşullar altında tarihe çıkarmak istiyorum. - Namratha
NoHistory özniteliğinin kullanılmasının, söz konusu etkinliğin bitmesini sağlayacağını unutmayın. Bu, örneğin G + girişiyle beklenmedik davranışlara neden olabilir. Görmek: stackoverflow.com/questions/20383878/... Benim app herhangi bir iz olmadan çökmesini devam ederken bu hatayı bulmak için bir süre aldı. - Acapulco
Gerekli bayrağı bir bağlantı olarak kopyalamak zordur, bu yüzden burada kolayca kopyalanabilir. android:noHistory="true" - MirroredFate


Bir sonraki aktiviteyi başlatırken etkinlik etkinliğinden önceki etkinliği kaldırmak için iletmeyi kullanabilirsiniz. APIDemos'ta bunun bir örneği var.ama temelde yaptığınız tek şey arıyor finish() çağrıdan hemen sonra startActivity().


130
2017-12-14 04:20



Merhaba Daniel, bu örnekte okudum, ancak bu sadece tarihçe 1 yığını tarafından temizlenecek, değil mi? Eğer yığınım A, B'ye benziyorsa ve C'yi başlatıyorsam, C'nin yeni kök olmasını ve A ve B'yi tamamen temizlemesini istiyorum. Sdk örneğinde, B'yi bitirmek () B'yi bir yığın ile bırakacaktır. C değil mi? Teşekkürler. - Mark
B'yi başlatırken A'yı temizleyebilir ve B'yi başlatırken B'yi temizleyebilirsiniz; Ancak, sanırım arzu ettiğiniz buysa B'den A'ya geri çıkamazsınız. Bu daha fazla düşünmem gerek, eğer sorun buysa. - Daniel Lew
Mark, istediğini elde etmek için bayrağı kullanmalısın: FLAG_ACTIVITY_CLEAR_TOP. Umut ediyorum bu yardım eder. - Francisco Junior
FLAG_ACTIVITY_CLEAR_TOP çalışmaz, çünkü C zaten arka yığında değil. - Timmmm
@DanielLew APIDemos'ta çok fazla örnek var. Önerilen örnek ismi alacak mıydınız? - Stephane


Evet, bir göz atın Intent.FLAG_ACTIVITY_NO_HISTORY.


49
2017-12-14 10:30



Bunun, başlattığınız etkinliğe ilişkin bir tarih belirlemediğini unutmayın. Başladığınız etkinlik için geçmiş bilgisine sahip olmamak için android:noHistory="true" tezahürde. - georgiecasey
Bu iyi çalışıyor. Kullan intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY) bu bayrağı ayarlamak için. - vovahost


Bu muhtemelen bunu yapmak için ideal bir yol değildir. Birisi daha iyi bir yolu varsa, bunu uygulamak için sabırsızlanıyorum. İşte nasıl ben Bu özel görev öncesi 11-sdk ile gerçekleştirildi.

Her sınıfta, açık zamanı geldiğinde gitmek istediğinizde, bunu yapmanız gerekir:

    ... interesting code stuff ...
    Intent i = new Intent(MyActivityThatNeedsToGo.this, NextActivity.class);
    startActivityForResult(i, 0);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == R.string.unwind_stack_result_id) {
        this.setResult(R.string.unwind_stack_result_id);
        this.finish();
    }
}

o zaman pop'lardan zincir kümesini çıkarması gereken tek şey onu başlatmak istediğinizde bunu çağırmak zorundadır:

NextActivity.this.setResult(R.string.unwind_stack_result_id);
NextActivity.this.finish();

Daha sonra faaliyetler yığında değil!
Bir etkinliği başlatabilmeniz için akılları hatırlayın ve ardından ardında temizlik yapmaya başlayın, yürütme tek bir (ui) diziyi takip etmiyor.


23
2018-05-13 03:04



Bu daha sonra herkesin karşısına çıkması durumunda, ekranın döndürülmesi durumunda Android'in sizin için son uygulamayı etkinleştirdiğinizde, uygulamanızın sizin için yararlı bir şekilde yeniden başlatılacağını bilmek önemli olduğunu düşündüm. Sadece bunun farkında ol! - Travis
Bir etkinliği yalnızca kullanıcının bir sonraki etkinlikte +1 yaptıklarına bağlı olarak koşullu olarak yığından kaldırmak istiyorsanız, bu iyi bir yanıttır. - theMothaShip


API 11 öncesi çalışmanın bir yolu başlamaktır ActivityGameMain önce, sonra onCreate Bu Etkinliğin başlangıç ActivitySplashScreen aktivite. ActivityGameMain splash için çok yakında startActivity öğesini çağırdığınızda görünmez.

O zaman sen kutu Başlarken yığını temizle ActivityGameMain Bu bayrakları Niyet'e göre ayarlayarak:

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);

Bunu ActivitySplashScreen'e de eklemelisiniz:

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

Böylece bu aktiviteye geri dönmek, sizin ActivityGameMain.

Bunu yapmak için başlangıç ​​ekranının geri dönülmesini istemediğinizi varsaymak istiyorum. noHistory senin içinde AndroidManifest.xml. Sonra koymak goBackPressed kodunuzda ActivitySplashScreenSignUp bunun yerine sınıf.

Ancak bunu kırmanın birkaç yolu buldum. Bir bildirimden başka bir uygulamayı başlatmak ActivitySplashScreenSignUp gösterilir ve arka tarih sıfırlanmaz.

Bunun tek gerçek yolu API 11'de:

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

20
2018-03-08 18:48





Ben bu şekilde kullanıyorum.

Intent i = new Intent(MyOldActivity.this, MyNewActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)
startActivity(i);

15
2017-09-15 01:32



Teşekkürler. Menümde bir Ana düğme olduğu durumda bunu yararlı buldum ve kullanıcı oradan ana sayfa tıklandığında bir kez yığılmış etkinliklerin görünmesini istemedim. - ghitesh


Biliyorum, buna geç kaldım (soru sorulduktan iki yıl geçti), ancak bunu geri düğmesine basarak durdurdum. Belirli etkinlikleri kontrol etmek yerine, sadece sayıma bakıyorum ve 3'ten küçükse uygulamayı sadece arkasına gönderir (uygulamayı duraklatır ve kullanıcıyı, lansmandan önce çalıştığı yere döndürür). Üçten daha azını kontrol ediyorum çünkü sadece bir giriş ekranım var. Ayrıca, sayımı kontrol ettiğimden, uygulamamın kullanıcının menü üzerinden ana ekrana geri dönmesine izin vermesi, böylece yığındaki intro ekranından başka etkinlikler varsa bunların normal gibi diğer ekranlarda yedeklenmesini sağlar.

//We want the home screen to behave like the bottom of the activity stack so we do not return to the initial screen
//unless the application has been killed. Users can toggle the session mode with a menu item at all other times.
@Override
public void onBackPressed() {
    //Check the activity stack and see if it's more than two deep (initial screen and home screen)
    //If it's more than two deep, then let the app proccess the press
    ActivityManager am = (ActivityManager)this.getSystemService(Activity.ACTIVITY_SERVICE);
    List<RunningTaskInfo> tasks = am.getRunningTasks(3); //3 because we have to give it something. This is an arbitrary number
    int activityCount = tasks.get(0).numActivities;

    if (activityCount < 3)
    {
        moveTaskToBack(true);
    }
    else
    {
        super.onBackPressed();
    }
}

8
2018-03-03 17:33





Sadece set noHistory="true" içinde apaçık dosya. Arka koltuktan kaldırılmakta olan aktiviteyi yapar.


6
2017-12-15 08:16





Bildiride şunları ekleyebilirsiniz:

android:noHistory="true"

<activity
android:name=".ActivityName"
android:noHistory="true" />

Ayrıca arayabilirsiniz

finish()

startActivity (hemen sonra) çağırdıktan hemen sonra (..)


5
2018-02-08 11:02



Etkinlik işaretlerini kullanmak, bildirilere bir şeyler koymaktan daha iyidir. - Trevor Hart


API için> 15’den API 23’e Benim durumumda başka bir çözüm işe yaramıyor. Sonunda bunu aldım.

 Intent nextScreen = new Intent(currentActivity.this, MainActivity.class);
 nextScreen.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
 startActivity(nextScreen);
 ActivityCompat.finishAffinity(currentActivity.this);

3
2017-11-04 17:53



Aynı soruya, bu sorunun cevabını da eklediniz. stackoverflow.com/questions/6330260/... Cevabınızı detaylandırın ve reddediyorum. - Shubhamoy