Çıkışta, “geri” düğmesinin yalnızca oturum açmış Etkinlikleri açmasını önleyerek Etkinlik geçmişi yığınını temizleyin


235

Uygulamamdaki tüm etkinliklerin görüntülenmesi için kullanıcının oturum açmış olması gerekir. Kullanıcılar hemen hemen her etkinlikten çıkış yapabilir. Bu, uygulamanın bir gereğidir. Herhangi bir noktada kullanıcı oturumu kapatırsa, kullanıcıyı Giriş'e göndermek istiyorumActivity . Bu noktada bu etkinliğin geçmiş yığınının altında olmasını istiyorum, böylece "geri" düğmesine basmak kullanıcıyı Android'in ana ekranına döndürür.

Bu sorunun birkaç farklı yere sorduğunu gördüm, hepsi benzer cevaplarla cevaplandı (burada özetlediğim), ancak geri bildirim toplamak için burada poz vermek istiyorum.

Belgelerinde belirtildiği gibi Intentbayraklarını ayarlayarak Giriş etkinliğini açmayı denedim FLAG_ACTIVITY_CLEAR_TOP, ancak Giriş etkinliğini geçmiş yığınının altına yerleştirme ve kullanıcının geri gitmesini önleme hedefime ulaşamıyorum daha önce görülen oturum açma etkinliklerine. Ben de kullanmayı denedimandroid:launchMode="singleTop" manifestte Giriş etkinliği için , ancak bu da hedefime ulaşmıyor (ve yine de hiçbir etkisi yok gibi görünüyor).

Geçmiş yığınını temizlemem veya daha önce açılan tüm aktiviteleri bitirmem gerektiğine inanıyorum.

Seçeneklerden biri, her etkinliğin onCreatekontrol giriş durumunu ve finish()giriş yapmadıysanız. Bu seçenek hoşuma gitmedi, çünkü geri düğmesi hala kullanılabilir, çünkü faaliyetler kendilerini kapattıkça geri dönüyor.

Bir sonraki seçenek, LinkedListstatik olarak her yerden erişilebilen tüm açık etkinliklere (belki de zayıf referanslar kullanarak) referanslar sağlamaktır. Çıkışta bu listeye erişeceğim ve daha önce açılmış olan tüm aktiviteleri tekrarlayacağım.finish() . Muhtemelen yakında bu yöntemi uygulamaya başlayacağım.

IntentAncak bunu başarmak için bazı bayrak hileleri kullanmayı tercih ederim . Yukarıda özetlediğim iki yöntemden birini kullanmak zorunda kalmadan uygulamamın gereksinimlerini karşılayabildiğimi öğrendiğim için çok mutlu olurum.

Bunu kullanarak Intentya da ayarları kullanarak bunu başarmanın bir yolu var mı , yoksa ikinci seçeneğim, LinkedListaçık etkinliklerin en iyi seçenek olarak kalmasını sağlamak mı? Yoksa tamamen göz ardı ettiğim başka bir seçenek var mı?

Yanıtlar:


213

Size başka bir yaklaşım önerebilirim IMHO daha sağlam. Temel olarak, oturum açmış durumda kalmanız gereken tüm Etkinliklerinize bir oturum kapatma mesajı yayınlamanız gerekir. Böylece tüm Etkinliklerinizde sendBroadcastbir ve yükleyebilirsiniz BroadcastReceiver. Bunun gibi bir şey:

/** on your logout method:**/
Intent broadcastIntent = new Intent();
broadcastIntent.setAction("com.package.ACTION_LOGOUT");
sendBroadcast(broadcastIntent);

Alıcı (güvenli Etkinlik):

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    /**snip **/
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction("com.package.ACTION_LOGOUT");
    registerReceiver(new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d("onReceive","Logout in progress");
            //At this point you should start the login activity and finish this one
            finish();
        }
    }, intentFilter);
    //** snip **//
}

27
@Christopher, her etkinlik oluşturulduğunda yayına kaydolur. Arka plana gittiğinde (yani yığının üstüne yeni bir etkinlik gelir), onStop () öğesi çağrılır, ancak yine de yayın alabilir. Sadece onStop () yerine onDestroy () içinde unregisterReceiver () öğesini çağırdığınızdan emin olmanız gerekir.
Russell Davis

9
Yığının herhangi bir yerinde bir etkinlik belleği kurtarmak için işletim sistemi tarafından kapatıldıysa bu işe yarar mı? Yani. sistem, yukarıdaki yayın gönderildikten sonra gerçekten bittiğini düşünecek mi ve geri düğmesine bastığınızda yeniden oluşturmayacak mı?
Jan Żankowski

5
Bu zarif bir çözüm gibi görünse de, bunun senkronize olmadığını belirtmek önemlidir.
Che Jami

34
Güzel bir çözüm, ancak yukarıdaki kodda açıklandığı gibi Yayın alıcısını kaydetmek yerine, bir LocalBroadcastManager.getInstance (this) .registerReceiver (...) ve LocalBroadcastManager.getInstance (this) .unregisterReceiver (..) . Diğer uygulamanız başka herhangi bir uygulamadan (güvenlik sorunu) niyet alabilir
Uku Loskit

5
@Warlock Doğru. Bu yaklaşımın tuzağı, arka yığındaki bir Faaliyetin sistem tarafından yok edilmesidir (belirtilen düşük bellek senaryosu gibi çeşitli nedenlerle olabilir). Bu durumda, Etkinlik örneği yayını almak üzere olmayacaktır. Ancak sistem yine de yeniden oluşturarak o Faaliyette geri gidecektir. Bu, "Aktiviteleri
Saklamayın

151

Yeni bir Android programcısının bu sorunu araştırmak ve tüm StackOverflow iş parçacıklarını okumak için bir gün geçirdiği bir geçit ayini gibi görünüyor. Şimdi yeni başladım ve gelecekteki bir hacıya yardımcı olmak için mütevazi deneyimin izini burada bırakıyorum.

İlk olarak, araştırmam için bunu yapmanın açık veya acil bir yolu yok (as of September 2012).Basit olabileceğini düşünürdün startActivity(new Intent(this, LoginActivity.class), CLEAR_STACK)ama hayır . .

Yapmanız CAN startActivity(new Intent(this, LoginActivity.class))ileFLAG_ACTIVITY_CLEAR_TOP - ve bu, yığın aşağı arama LoginActivity sizin daha önceki orijinal örneğini bulmak, onu yeniden ve (yukarı) yığının kalanını temizlemek için çerçeveyi neden olacaktır. Oturum Açma, muhtemelen yığının altında olduğundan, artık boş bir yığına sahipsiniz ve Geri düğmesi yalnızca uygulamadan çıkar.

AMA - bu yalnızca, orijinal LoginActivity örneğini daha önce yığınızın tabanında canlı bırakırsanız çalışır. Birçok programcı gibi, sen üzere seçerse finish()o LoginActivitykullanıcı başarıyla sonra yığının tabanına artık üzerinizde ve oturum sonra FLAG_ACTIVITY_CLEAR_TOPsemantik geçerli değildir ... Yeni bir oluştururken sonunda LoginActivitymevcut yığının üstünde. Bu neredeyse kesinlikle ne istediğinizi DEĞİLDİR (kullanıcı önceki ekrana giriş yollarını 'geri' tuhaf davranış).

Daha önce var ise finish()'d LoginActivitysize yığını temizlenmesi ve daha sonra yeni bir başlangıç için bazı mekanizmalar sürdürmeye ihtiyaç LoginActivity. Bu @doreamonkonudaki cevap en iyi çözüm gibi görünüyor (en azından mütevazi gözüme):

https://stackoverflow.com/a/9580057/614880

LoginActivity'yi canlı bırakıp bırakmamanın zor etkilerinin bu karışıklığa neden olduğundan şüpheleniyorum.

İyi şanslar.


5
İyi cevap. Çoğu insanın önerdiği FLAG_ACTIVITY_CLEAR_TOP hilesi, LoginActivity'yi bitirdiyseniz işe yaramaz.
Konsumierer

Cevabınız için teşekkürler.Diğer bir senaryo, oturumun (örn. Fb gibi) olduğu zamanki gibidir, hatta Giriş etkinliğini çağırmıyoruz, bu nedenle yığınta Giriş etkinliğinin hiçbir noktası yoktur. Sonra yukarıda belirtilen yaklaşım işe yaramaz.
Prashanth Debbadwar

118

GÜNCELLEME

süper finishAffinity()yöntem kodu azaltmaya yardımcı olur ancak aynı şeyi başarır. Mevcut etkinliği ve yığındaki tüm etkinlikleri bitirir, getActivity().finishAffinity()bir parçadaysanız kullanın.

finishAffinity(); 
startActivity(new Intent(mActivity, LoginActivity.class));

ORİJİNAL CEVAP

LoginActivity -> HomeActivity -> ... -> AyarlarActivity çağrı signOut () öğesinin:

void signOut() {
    Intent intent = new Intent(this, HomeActivity.class);
    intent.putExtra("finish", true);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // To clean up all activities
    startActivity(intent);
    finish();
}

HomeActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    boolean finish = getIntent().getBooleanExtra("finish", false);
    if (finish) {
        startActivity(new Intent(mContext, LoginActivity.class));
        finish();
        return;
    }
    initializeView();
}

Bu benim için işe yarıyor, umarım sizin için de yararlıdır. :)


1
Çözümünüzün kullanıcının signOut'u tıklayıp yalnızca bir etkinliğe (HomeActivity) geri döneceğini varsayar. Yığında 10 etkinliğiniz varsa ne olur?
IgorGanapolsky

11
HomeActivity'nin üstünde 10 etkinliğiniz varsa, FLAG_ACTIVITY_CLEAR_TOP bayrağı hepsini temizlemenize yardımcı olur.
thanhbinh84

1
Bu yalnızca HomeActivity'yi başlatırken OnCreate of HomeActivity'yi alırsanız işe yarayabilir. Sadece ev aktivitesine başlamak, daha önce bitmemiş veya yok edilmemişse mutlaka yeniden yaratmayacaktır. HomeActivity'nin yeniden oluşturulması gerekmiyorsa, OnCreate çağrılmaz ve oturumu kapattıktan sonra ev etkinliğinizde oturuyor olursunuz.
topwik

1
Bu olası bir çözümdür ve oturum kapatma gibi basit (kullanıcı için) bir özelliği çok daha az kodlamayı içerir.
Subin Sebastian

2
Intent.FLAG_ACTIVITY_CLEAR_TOP bayrağı HomeActivity dahil tüm etkinliklerin temizlenmesine yardımcı olur, bu nedenle bu etkinliği yeniden başlattığınızda onCreate () yöntemi çağrılır.
thanhbinh84

73

API 11 veya üstünü kullanıyorsanız şunları deneyebilirsiniz: FLAG_ACTIVITY_CLEAR_TASK- tam olarak yaşadığınız sorunu ele alıyor gibi görünüyor. Açıkçası, API 11 öncesi kalabalık, @doreamon'un önerdiği gibi, tüm aktivitelerin fazladan kontrol etmesinin bir kombinasyonunu veya başka bir numarayı kullanmak zorunda kalacaktı.

(Ayrıca not: Bunu kullanmak için geçmeniz gerekir FLAG_ACTIVITY_NEW_TASK)

Intent intent = new Intent(this, LoginActivity.class);
intent.putExtra("finish", true); // if you are checking for this in your other Activities
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | 
                Intent.FLAG_ACTIVITY_CLEAR_TASK |
                Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();

1
Bir cazibe gibi çalışmak. Çok teşekkür ederim! Min API 14 üzerinde geliştirdiğimde, uygulanması gereken tek şey bu.
AndyB

1
Bu çözümü LoginActivity için kullanırken FLAG_ACTIVITY_CLEAR_TOP'a ihtiyacımız olmadığını düşünüyorum.
Bharat Dodeja

Ben sadece finish();çıkıştan sonra geri gitmesini önlemek için işi yapacak düşünüyorum . Bayrak ayarlamaya ne gerek var?
Pankaj

Bu bir istisna oluşturur Etkinlik içeriğinin dışından startActivity () öğesini çağırmak FLAG_ACTIVITY_NEW_TASK bayrağı gerektirir
Aman

31

Bunun için de birkaç saat geçirdim ... ve FLAG_ACTIVITY_CLEAR_TOP'un istediğiniz gibi göründüğünü kabul ediyorum : başlatılan etkinlik dışında tüm yığını temizleyin, böylece Geri düğmesi uygulamadan çıkar. Yine de Mike Repass'ın belirttiği gibi, FLAG_ACTIVITY_CLEAR_TOP yalnızca başlattığınız etkinlik zaten yığıntayken çalışır; etkinlik orada olmadığında, bayrak hiçbir şey yapmaz.

Ne yapalım? Başlatılan etkinliği FLAG_ACTIVITY_NEW_TASK ile yığına koyun , bu da o etkinliği geçmiş yığınında yeni bir görevin başlangıcı yapar. Ardından FLAG_ACTIVITY_CLEAR_TOP bayrağını ekleyin.

Şimdi, FLAG_ACTIVITY_CLEAR_TOP yığındaki yeni etkinliği bulmaya gittiğinde, orada olacak ve her şey temizlenmeden önce kaldırılacak.

İşte çıkış fonksiyonum; View parametresi, işlevin bağlı olduğu düğmedir.

public void onLogoutClick(final View view) {
    Intent i = new Intent(this, Splash.class);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    startActivity(i);
    finish();
}

1
FLAG_ACTIVITY_CLEAR_TASKHenüz eklenmediği için API <= 10 üzerinde çalışmaz
Youans

1
@christinac FLAG_ACTIVITY_CLEAR_TOP hakkında konuşuyorsunuz ve kod pasajınızda FLAG_ACTIVITY_CLEAR_TASK var; hangisi geçerli?
Marian Paździoch

10

Birçok cevap. Belki bu da yardımcı olacaktır-

Intent intent = new Intent(activity, SignInActivity.class)
                .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
this.startActivity(intent);
this.finish();

Kotlin versiyonu

Intent(this, SignInActivity::class.java).apply {
    addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
    addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
}.also { startActivity(it) }
finish()

4

Bunu kullanın, size yardımcı olacaktır. Biraz değiştirilmiş xbakesx cevabı.

Intent intent = new Intent(this, LoginActivity.class);
if(Build.VERSION.SDK_INT >= 11) {
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK);
} else {
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
}
startActivity(intent);

4

Kabul edilen çözüm doğru değil, yayın alıcısı kullanmak bu sorun için iyi bir fikir olmadığından sorunları var. Etkinliğiniz zaten onDestroy () yöntemini çağırdıysa, alıcı alamazsınız. En iyi çözüm, paylaşılan tercihlerinizde bir boole değerine sahip olmak ve etkinliğinizin onCreate () yönteminde kontrol etmektir. Kullanıcı oturum açmamışken çağrılmaması gerekiyorsa etkinliği sonlandırın. İşte bunun için örnek kod. Çok basit ve her koşul için çalışıyor.

protected void onResume() {
  super.onResume();
  if (isAuthRequired()) {
    checkAuthStatus();
  }
}

private void checkAuthStatus() {
  //check your shared pref value for login in this method
  if (checkIfSharedPrefLoginValueIsTrue()) {
    finish();
  }
}

boolean isAuthRequired() {
  return true;
}

1
Yıllar geçti ama her ikisini de yaptığımı düşünüyorum. Her Etkinlik, kullanıcının onCreate () içindeki oturum açma durumunu kontrol eden LoggedInActivity'yi genişletti. LoggedInActivity "kullanıcı oturumunu kapattı" yayınını da dinledi ve buna yanıt vermek için ne gerekiyorsa yaptı.
skyler

2
büyük olasılıkla checkAuthStatus'u yönteme koymalısınız onResume(). Çünkü geri düğmesine bastığınızda, etkinlik oluşturmak yerine etkinliğin sürdürülme olasılığı daha yüksektir.
maysi

1
@maysi Öneri için teşekkürler, evet bu şekilde geri düğmesi de doğru şekilde çalışacaktır, girişi güncelledim
Yekmer Şimşek

4

Bazen finish()çalışmıyor

Bu sorunu çözdüm

finishAffinity()


3

Bu soruya farklı bir yaklaşım öneririm. Belki de en verimli olanı değildir, ancak uygulanması en kolay olanıdır ve çok az kod gerektirir. İlk etkinliğinizde (benim durumumda oturum açma etkinliği) sonraki kodu yazmak, kullanıcının oturumu kapattıktan sonra daha önce başlatılmış etkinliklere geri dönmesine izin vermez.

@Override
public void onBackPressed() {
    // disable going back to the MainActivity
    moveTaskToBack(true);
}

Kullanıcı oturum açtıktan hemen sonra LoginActivity'nin bittiğini varsayıyorum, böylece geri düğmesine basarak daha sonra geri dönemez. Bunun yerine, kullanıcının düzgün bir şekilde oturumu kapatmak için uygulamanın içindeki bir oturum kapatma düğmesine basması gerekir. Bu oturum kapatma düğmesinin uygulayacağı basit bir niyettir:

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

Tüm önerilerinizi bekliyoruz.


2

Seçilen cevap akıllı ve aldatıcıdır. İşte böyle yaptım:

LoginActivity, görevin kök etkinliğidir, android'i ayarlayın : noHistory = Manifest.xml dosyasında "true" ; SettingsActivity'den çıkış yapmak istediğinizi varsayalım, aşağıdaki gibi yapabilirsiniz:

    Intent i = new Intent(SettingsActivity.this, LoginActivity.class);
    i.addFlags(IntentCompat.FLAG_ACTIVITY_CLEAR_TASK
            | Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(i);

2

İşte benim app geldi çözüm.

LoginActivity'de, bir girişi başarıyla işledikten sonra, API düzeyine bağlı olarak bir sonrakini farklı şekilde başlatıyorum.

Intent i = new Intent(this, MainActivity.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    startActivity(i);
    finish();
} else {
    startActivityForResult(i, REQUEST_LOGIN_GINGERBREAD);
}

Sonra benim LoginActivity's onActivityForResult yönteminde:

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB &&
        requestCode == REQUEST_LOGIN_GINGERBREAD &&
        resultCode == Activity.RESULT_CANCELED) {
    moveTaskToBack(true);
}

Son olarak, başka herhangi bir Faaliyette oturumu kapattıktan sonra:

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

Gingerbread'te, bunu yaparsanız, MainActivity'den geri düğmesine basarsam, LoginActivity hemen gizlenir. Honeycomb ve sonraki sürümlerde, LoginActivity'yi bir oturum açtıktan sonra bitiriyorum ve oturumu kapattıktan sonra düzgün bir şekilde yeniden oluşturuluyor.


Benim için çalışmıyor. Benim durumumda parçalanma kullandım. Onactivityresult yöntemi çağrılmaz.
Mohamed Ibrahim

1

Bu benim için çalıştı:

     // After logout redirect user to Loing Activity
    Intent i = new Intent(_context, MainActivity.class);
    // Closing all the Activities
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

    // Add new Flag to start new Activity
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    // Staring Login Activity
    _context.startActivity(i);

Verdiğiniz çözüm hakkında biraz daha açıklama ekleyerek cevabınızı biraz daha açıklayabilir misiniz?
abarisone

0

StartActivityForResult ile etkinliğinize başlayın ve oturumunuzu kapatırken sonucunuzu belirleyin ve sonucunuza göre etkinliğinizi bitirin

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivityForResult(intent, BACK_SCREEN);

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
    case BACK_SCREEN:
        if (resultCode == REFRESH) {
            setResult(REFRESH);
            finish();
        }
        break;
    }
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        AlertDialog alertDialog = builder.create();

        alertDialog
                .setTitle((String) getResources().getText(R.string.home));
        alertDialog.setMessage((String) getResources().getText(
                R.string.gotoHome));
        alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "Yes",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog,
                            int whichButton) {

                        setResult(REFRESH);
                        finish();
                    }

                });

        alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "No",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog,
                            int whichButton) {
                    }
                });
        alertDialog.show();
        return true;
    } else
        return super.onKeyDown(keyCode, event);

}

0

@Doreamon sağlanan çözüm biri hariç tüm durumlar için iyi çalışır:

Giriş yaptıktan sonra, Giriş Ekranı Öldürme kullanıcısı doğrudan orta ekrana geçerse. Örneğin A-> B-> C akışında şu şekilde gezinin: Giriş -> B -> C -> Ana kısayola basın. Home (A) yığın geçmişinde olmadığından FLAG_ACTIVITY_CLEAR_TOP kullanımı yalnızca C etkinliğini temizler. Bir ekrana geri basmak bizi B'ye götürecektir.

Bu sorunu çözmek için, bir aktivite yığını tutabiliriz (Arraylist) ve eve basıldığında, bu yığındaki tüm aktiviteleri öldürmek zorundayız.


0

SharedPreferences'da veya Uygulama Etkinliğinde bir bayrak yöneterek mümkündür.

Uygulamanın başlangıcında (Açılış Ekranında) flag = false; Oturumu Kapat Tıklaması olayında bayrağı doğru olarak ayarlayın ve her etkinliğin OnResume () öğesinde işaretin doğru olup olmadığını kontrol edin ve sonra finish () öğesini çağırın.

Mucizevi şekilde çalışır :)


0

Oturumu Kapat'a tıkladığınızda bunu arayabilirsiniz

private void GoToPreviousActivity() {
    setResult(REQUEST_CODE_LOGOUT);
    this.finish();
}

Önceki Etkinliğin onActivityResult () yöntemi, tüm etkinlikleri tamamlayana kadar yukarıdaki kodu tekrar çağırın.


1
Bu, finish () öğesinin bir kerede yayınlanması yerine tüm aktiviteler arasında doğrusal olarak geçiş yapması gerektiği anlamına mı geliyor?
IgorGanapolsky

@Igor G. evet sırayla bitirmek için alternatif bir yol
Mak

-1

Seçeneklerden biri, her etkinliğin onCreate onay oturum açma durumunu sağlamak ve oturum açmadıysa bitirmek (). Bu seçenek hoşuma gitmedi, çünkü geri düğmesi hala kullanılabilir, çünkü faaliyetler kendilerini kapattıkça geri dönüyor.

Yapmak istediğiniz şey onStop () veya onPause () yöntemlerinizde logout () ve finish () yöntemlerini çağırmaktır. Bu, etkinlik artık geri alındığından Android'i onCreate () öğesini çağırmaya zorlayacaktır. Sonra söylediğiniz gibi yapın, onCreate () 'de oturum açma durumunu kontrol edin ve oturum açmadıysanız oturum açma ekranına iletin.

Yapabileceğiniz başka bir şey, onResume () 'de oturum açma durumunu kontrol etmek ve oturum açmadıysanız, bitirmek () ve oturum açma etkinliğini başlatmaktır.


Her etkinlik duraklamasında veya durmasında oturumu kapatmamayı tercih ederim. Ayrıca, uygulama oturumu kapatma veya giriş başlatır, bu yüzden gerçekten giriş olup olmadığını kontrol etmek gerekmez.
skyler

@Ricardo: Çözümünüz bir BroadcastReceiver gerektirmiyor mu?
IgorGanapolsky
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.