Önceki aktiviteye geri dönmeyi nasıl önleyebilirim?


210

Telefonda GERİ düğmesine basıldığında, belirli bir etkinliğin öncekine dönmesini önlemek istiyorum.

Özellikle, giriş ve kayıt ekranlarım var, her ikisi de HomeScreenbaşarılı giriş / kayıt olduğunda yeni bir etkinlik başlatıyor . HomeScreen başlatıldıktan sonra, kullanıcıların GERİ tuşuna basarak oturum açma veya kayıt ekranlarına geri dönmesini engellemek istiyorum.

Kullanmayı denedim Intent.FLAG_ACTIVITY_NO_HISTORY, ancak uygulama Facebook entegrasyonu içerdiğinden, 'Facebook ile Giriş' kullanıldığında, Facebook ilk giriş ekranına dönmeli, bu nedenle bu etkinliklerin geçmişini tutmalıyım.

HomeScreenDüğmeye basıldığında bir uygulamayı doğrudan bitirmek için GERİ düğmesinin davranışını geçersiz kılmayı düşündüm ve kullandım

@Override
public void onBackPressed() {
    finish();
}

ama bu da işe yaramıyor.


1
Sadece açıklığa kavuşturmak için, facebook dışındaki herkes için davranışı yakalamaya mı çalışıyorsunuz?
havexz

2
Bir anlamda evet, ama aslında istediğim şey başarılı bir giriş yaptıktan ve HomeScreen açıldıktan sonra, GERİ düğmesine basarak kullanıcı giriş ekranına geri dönememeli. Örneğin Twitter veya Foursquare gibi, bu uygulamalara giriş yaptığımızda, oturumu kapatana kadar giriş sayfasını görmüyoruz (giriş yaptıktan sonra GERİ düğmesine bassak bile).
ecem

Yanıtlar:


345

Benim önerim, kullanıcıların geri dönmesini istemediğiniz etkinliği bitirmek olacaktır. Örneğin, oturum açma etkinliğinizde, aradıktan hemen sonra startActivityarayın finish(). Kullanıcılar geri düğmesine bastığında, yığıntan öldürüldüğünden oturum açma etkinliğine gidemezler.


2
Önceki etkinlikte iş parçacığının çalışmaya devam etmesini isterseniz ne olur?
AlleyOOP

2
O zaman benim yaklaşımımla gitmek istemezdin. Finish () çağrıldığında etkinlik sona erecek. Gerçekleştireceğiniz aktivitede çalıştırmak istediğiniz işleminize başlayabilir misiniz?
kodlayıcı

7
Not: finishPaylaşılan bir geçiş sırasında arama yaparsanız, önceki etkinlikten bir sızma olabilir. Eğer varsa, örneğin HomeActivity-> IntermediateActivity-> FinalActivityve çağrı finish()içinde IntermediateActivityçalıştıktan hemen sonra FinalActivitygöreceğiniz HomeActivitykısa bir an için.
David Murdoch

101

Aşağıdaki çözüm, normal giriş / ana etkinlik senaryosunda veya bir engelleme ekranının uygulanmasında oldukça yararlı olabilir.

Önceki etkinliğe geri dönmek yerine uygulamayı en aza indirmek için şu şekilde geçersiz kılabilirsiniz onBackPressed():

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

moveTaskToBack(boolean nonRoot)arka yığınınızı olduğu gibi bırakır, görevinizi (tüm etkinlikler) arka plana koyar. Kullanıcının Ana Ekran düğmesine basmasıyla aynı .

Parametre boolean nonRoot- false olursa, bu yalnızca etkinlik bir görevin kökü ise çalışır; doğruysa, bir görevdeki herhangi bir etkinlik için çalışır.


3
Bir giriş ekranı için mükemmeldir, çünkü geçmişi korur.
Hackmodford

Teşekkürler, bunu yaklaşık üç gün bulmaya çalıştım. Android nedeniyle: Etkinlik için noHistory = "true" bayrağı beklendiği gibi çalışmıyor (noHistory bayrağı minimizasyondan sonra etkinliği yeniden oluşturur) ve finish () bazen benim için çalışmadı, ama neden hala anlamadım.
Denshov

37

Tam olarak ne istediğinizden emin değilim, ancak mümkün olması gerektiği gibi geliyor ve aynı zamanda zaten doğru yolda olduğunuz gibi geliyor.

İşte size yardımcı olabilecek birkaç bağlantı:

Android'de geri düğmesini devre dışı bırak

  MyActivity.java =>
    @Override
    public void onBackPressed() {

       return;
    }

Bir etkinliğe 'geri dönmeyi' nasıl devre dışı bırakabilirim?

  AndroidManifest.xml =>
<activity android:name=".SplashActivity" android:noHistory="true"/>

1
Sorumda açıklamaya çalıştığım Facebook sorunu ve yorumlardan biri nedeniyle noHistory seçeneğini kullanamıyorum. Ancak GERİ düğmesi ile ilgili şey onu devre dışı bırakmaz, ancak tüm uygulamadan çıkması gibi System.exit(0)denir (En iyi pratik olmadığını biliyorum, ama sadece bir örnek vermek istedim).
ecem

Teşekkürler bu harika çalıştı. Burada yapacağım tek öneri, dönüş için gerek yoktur. Super.onBackPressed () öğesini kaldırın ve yöntemi boş bırakın. Bu da iyi çalışıyor
hyperCoder

20

Durumunuz için iki çözüm vardır, A etkinliği B etkinliğini başlatır, ancak B etkinliğindeki A etkinliğine geri dönmek istemezsiniz.

1. Önceki A etkinliği arka desteden kaldırıldı.

    Intent intent = new Intent(activityA.this, activityB.class);
    startActivity(intent);
    finish(); // Destroy activity A and not exist in Back stack

2. Devre dışı bırakıldığında B aktivitesinde geri düğmesi eylemi.

Geri dönüş olayını aşağıdaki gibi önlemenin iki yolu vardır,

1) tavsiye yaklaşımı

@Override
public void onBackPressed() {
}

2 on onKeyDown yöntemini geçersiz kıl

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode==KeyEvent.KEYCODE_BACK) {
        return false;
    }
    return super.onKeyDown(keyCode, event);
}

Umarım faydalıdır, ancak yine de durumlarınıza bağlıdır.


3
OnBackPressed () işlevini devre dışı bırakmak kötü bir kullanıcı deneyimi değil midir?
C. Skjerdal

Tamamen ne yapmaya çalıştığınıza bağlıdır, uygulama işlevselliğinde buna ihtiyaç duyulur.
user3099225

İlk yöntemi kullanarak tamamen nasıl unuttuğum şaşırtıcı finish(). Gereksiz yere overthought ile nohistoryvb özniteliği, niyet bayrakları, ebeveyn etkinlik apaçık etiketleri,! Aptalca, cevap için teşekkürler!
varun

8

Zaten çok sayıda harika çözüm önerildiğinden, daha kapsamlı bir açıklama yapmaya çalışacağım.

Önceki etkinliğe geri nasıl geçilir ?

Önceki Etkinliği Backstack'ten kaldırın. Basit

Önceki Etkinliği Backstack'tan nasıl kaldırırım?

Çağrı finish()yöntemi

Normal Akış:

resim açıklamasını buraya girin
Tüm etkinlikler Backstack olarak bilinen bir Yığın içinde saklanır.
Yeni bir Aktivite ( startActivity(...)) başlattığınızda yeni Aktivite yığının üstüne itilir ve geri düğmesine bastığınızda Aktivite yığından açılır. Dikkat edilmesi gereken
önemli bir nokta , geri düğmesine basıldığında finish();yöntemin dahili olarak çağrılmasıdır. Bu, onBackPressed () yönteminin varsayılan davranışıdır.

Etkinlik B'yi atlamak istiyorsanız?

yani A <--- C

Etkinlik B'den finish();sonra yöntem eklemeniz yeterlidirstartActvity(...)

Intent i = new Intent(this, C.class);
startActivity(i);
finish();

resim açıklamasını buraya girin


6

finish()tüm uygulamayı değil mevcut Etkinliği kapatmak için bir yöntem sağlar. Ve uygulamayı öldürmek için yöntemler aramaya çalışsan iyi edersin. Küçük tavsiye.

Birlikte çalışmayı denediniz Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_NO_HISTORYmi? Bu bayrakları Intentbaşlangıç ​​etkinliğinde kullanmayı unutmayın !


2
FLAG_ACTIVITY_NO_HISTORYFacebook ile Giriş kullanıldığında LoginScreen'in Facebook'un geri aramasını yakalamasını önler. Odak LoginScreen'in dışına çıktığında, devam ettirilemez (geçmiş olmadığı için). Ama denemedim Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS, kontrol edeceğim, teşekkürler!
ecem

ayrıca finish()yöntem hakkında teşekkürler , bunu bilmiyordum.
ecem

4

finish()Hemen arkasına koy

Intent i = new Intent(Summary1.this,MainActivity.class);
            startActivity(i);
finish();

1
Temel olarak dört yıl önce kabul edilen cevap budur.
TylerH

3

paulsm4'ün cevabı doğrudur. Varsa onBackPressed()iade sadece, geri düğmesini devre dışı bırakacaktır. Bununla birlikte, kullanım durumunuz göz önüne alındığında daha iyi bir yaklaşımın etkinlik mantığını çevirmek, yani ev etkinliğinizi ana yapmak, kullanıcının orada oturum açıp açmadığını kontrol etmek, oturum açma etkinliğini başlatmak olduğunu düşünüyorum. Bunun nedeni, ana etkinliğinizdeki geri düğmesini geçersiz kılarsanız, çoğu kullanıcı geri bastığında karıştırılır ve uygulamanız hiçbir şey yapmaz.



3

Bu yöntem iyi çalışıyor

Intent intent = new Intent(Profile.this, MainActivity.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);

2

Sadece onKeyDown yöntemini geçersiz kılın ve geri düğmesine basılıp basılmadığını kontrol edin.

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    if (keyCode == KeyEvent.KEYCODE_BACK) 
    {
        //Back buttons was pressed, do whatever logic you want
    }

    return false;
}

1
@Override
public void onBackPressed() {
}

Oluşturduğunuzda onBackPressed()yalnızca kaldırın super.onBackPressed();ve bu işe yaramalıdır


1

Koymak

finish();

ActivityStart'tan hemen sonra, aktiviteye geri dönmenin herhangi bir yolunu önleyerek durdurmak için. Sonra Ekle

onCreate(){
    getActionBar().setDisplayHomeAsUpEnabled(false);
    ...
}

başlattığınız aktiviteye.

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.