Android'de etkinliği kapatma ve önceki etkinliğe geri dönme


144

Bir düğmeye tıkladığınızda, yeni bir etkinlik başlattığında, bunu yapmak için aşağıdaki kodu kullandığım bir ana faaliyet var:

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

Yukarıdaki kod ana faaliyetten çalıştırıldı.

Şimdi ana faaliyet tarafından çağrılan yeni etkinliğimde bir geri düğmem var. Bu geri düğmesine tıkladığımda yeni aktivitemin kapanmasını istiyorum ve orijinal ana aktiviteye geri dönmesi gerekiyor.

Aramayı denedim super.finish()ve sadece finish() (yeni etkinlikten) ama bu daha sonra tüm uygulamamı kapatıyor (ana faaliyetim dahil).

Şu anda odakta olan etkinliği nasıl kapatabilirim ve sonra ana etkinliğe geri dönebilirim?

REDAKTE

Telefonumun geri düğmesinin de tüm uygulamamı kapatması, ikinci etkinliği yanlış başlattığımı düşünmemi sağlıyor?


Tamam bakıyordum,

Etkinliği başlatmak için aynı bildirim kodunu ve aynı kodu kullanan bir Ayarlar Etkinliği oluşturdum.

Geri düğmesine bastığımda Etkinlik ayarları için, Ana etkinliğe geri döner.

Ana soruda yukarıda belirtilen aktivite ile sadece tüm uygulamamdan çıkar.

Dolayısıyla sorun, aktiviteyi bitirmek için kodla değil, aktivitenin kendisiyle ilgili gibi görünüyor.


4
Geri düğmesine bile ihtiyacınız yok, sadece kullanıcının telefonu geri tuşunu kullanmasına izin verin ve hiçbir şey yapmanıza gerek yok.
Hoan Nguyen

Telefonların geri düğmesi yalnızca ikincil etkinliğim değil giriş uygulamasını da kapatır. Ana faaliyeti kapatmak istemiyorum.
Zapnologica

1
'Geri' düğmesi bunu yapmamalıdır - kodunuzun daha fazlasını gösterebilir misiniz?
peejaybee

Düzenlemenize yanıt olarak, ikincil etkinlik yayınladığınızdan daha iyi görünür. Sanırım TGMCians muhtemelen doğru cevaba sahip ve siz tezahürünüzü araştırıyorsunuz.
peejaybee

bu cevabı gör, bunun sana yardım edeceğini düşünüyorum
Muhammed Helmi

Yanıtlar:


201

Bence başlamadan önce finish()metodu çağırıyorsunuz .MainActivitySettingsActivity

Açıkladığınız senaryo iki şekilde gerçekleşir:

YA

Sen belirledik android:noHistory = "true"için MainActivityAndroidManifest.xmlnedenleri MainActivityiçin finishgeri tuşuna basarak otomatik.

VEYA

Senin 'SettingsActivity' geçiş önce, çağrıda finish()Gözlerinde farklı MainActivityöldürür, hangi. Geri düğmesine bastığınızda, yığında başka bir etkinlik önceden ayarlanmayacağından ana ekrana geri döner.


Bu, telefonun 'geri' düğmesinin neden ana etkinliği de reddettiğini açıklıyor.
peejaybee

Hata ayıklama yaparken, yürütmenin bittikten sonra devam ettiğini fark ettim (), bu yüzden ek olarak bir dönüş koymanız önerilir.
e kadar

Bu cevabın üçüncü nedeni sadece birincinin tekrarı değil midir?
Pang

60

Bulunduğunuz etkinlikte yalnızca finish () öğesini çağırarak önceki etkinliğe geri dönebilirsiniz. Finish () çağrısından sonraki herhangi bir kodu not edin - bunu düzeltmek için finish () çağrıldıktan sonra bir dönüş yapabilirsiniz.

Sonuçları bir etkinliğe geri döndürmek istiyorsanız, ikinci etkinliğe başlarken aşağıdakilere ihtiyacınız vardır:

startActivityForResults(myIntent, MY_REQUEST_CODE);

Aranan etkinliğinizin ardından Intent'i onCreate () parametresinden alabilir veya

getIntent();

Bir sonucu etkinlik 1'e sonra etkinlik iki'de döndürmek için

setResult(Activity.RESULT_OK, MyIntentToReturn);

Eğer geri dönmek gibi bir niyetiniz yoksa,

setResult(Activity.RESULT_OK);

Etkinliğin kötü sonuçları varsa, Activity.RESULT_CANCELED kullanabilirsiniz (varsayılan olarak kullanılır). Sonra birinci aktivitede

onActivityResult(int requestCode, int resultCode, Intent data) {
    // Handle the logic for the requestCode, resultCode and data returned...
}

Etkinliği bitirmek için, sonuçlarınız önceden ayarlanmış olarak finish () ile aynı yöntemleri kullanın.


1
"Finish () çağrısından sonra herhangi bir kodu not edin - bunu düzeltmek için finish () çağrıldıktan sonra bir dönüş yapabilirsiniz" Bence 'fix' kelimelerin kötü bir seçim olduğunu düşünüyorum. Daha çok aşağıdaki satırların yürütülmesinden kaçınıyorsunuz (sabitleme değil).
Lo-Tan

14

Düğmenizi tıkladığınızda aramasını sağlayabilirsiniz:

super.onBackPressed();

12

Eğer fragman kullanıyorsanız u kullanmalısınız

getActivity().onBackPressed();

Eğer tek aktivite kullanıyorsanız u kullanabilirsiniz

finish();

7

şu kodu deneyin finish:

onBackPressed();


2
ActivityB'den ActivityA'ya geri dönmek için iyi çalışır. Parçalar ve tek aktiviteler için @Osama Ibrahim'in cevabını kullanabilir.
Eftekhari


4
Button edit = (Button) view.findViewById(R.id.yourButton);
edit.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View view) {
        Intent intent = new Intent(this, YourMainActivity.class);
        startActivity(intent);
        finish();
    }
});


4

İkinci etkinliğinizin muhtemelen bir çocuk etkinliği olarak ana etkinliğinizle bağlantılı olmadığına inanıyorum. AndroidManifest.xmlDosyanızı kontrol edin ve <activity>alt etkinliğiniz için yapılan girdinin bir android:parentActivityNameözellik içerip içermediğine bakın. Bunun gibi bir şeye benzemeli:

<?xml ...?>
...
<activity
    android:name=".MainActivity"
    ...>
</activity>
<activity
    android:name=".ChildActivity"
    android:parentActivityName=".MainActivity"
    ...>
</activity>
...

1

Sadece demiyorlar finish()senin üzerinde MainActivityo zaman bu ortadan kaldırmak için geçersiz kılma ihtiyacını onBackPressed()senin içinde SecondActivityo fonksiyonun başka şeyler yapıyoruz sürece. Bu geri düğmesi için "ihtiyaç" hissetmek, o zaman basitçe çağırabilir finish()üzerinde SecondActivityve sizin götürecektir MainActivitysizi aramadım sürece finish()Üzerinde


Bu rotayı denedim, ancak yüksek çözünürlüklü PNG'ler kullanan yaklaşık 10 ekranım var. Sorun, ekran 7'ye gelindiğinde, arka yığındaki tüm aktiviteler nedeniyle cihazın anıları kalmamasıdır. Her etkinlik için bitirmeye karar verdim ve bu, çöp toplamaya izin vererek sorunu düzeltti, ancak şimdi geri yığınının boş olduğu için geri davranışın manuel olarak kodlanması gerekiyor. Bu sorunla karşılaştınız mı veya Android'de bunu ele almak için herhangi bir mekanizma biliyor musunuz?
Lo-Tan

Geri düğmesinin ne yapmasını istiyorsunuz? Önceki ne olursa olsun geri dön Activityya da her zaman geri dön MainActivity? Ayrıca, belleği yetersizse, Dokümanların Bu bölümünüBitmaps okumalısınız . Bana yardımcı oldu
codeMagic

@ Lo-Tan önceki aktiviteye geri dönmek istiyorsanız, o zaman resimleriniz için hafıza yönetimini bulmanız ve aktiviteleri bitirmemeniz gerektiğini düşünüyorum (belki de sağladığım bağlantı ile). Aksi takdirde, etkinliğin yeni bir örneğini yeniden oluşturmanız ve hangisine geri döneceğinizi anlamaya
çalışmanız

Geri düğmesinin önceki ekrana gitmesini istiyorum. Bu temelde bir dizi öğretici ekran ve kullanıcı ileri / geri gidebilir. Her ekran tasarlanmıştır ve çok sayıda png kullanır - bazen ekranın çoğunu alan png'ler (sadece küçük resimler değil), böylece her ekran için çok fazla bellek emer.
Lo-Tan

@ Lo-Tan Ben onBackPressed () yöntemini geçersiz kılmak ve sonra sadece el ile gitmek istediğiniz etkinliği oluşturmak istediğiniz düşünüyorum. Ardından bulunduğunuz kişiyi sonlandırabilir ve bir öncekini başlatabilirsiniz.
Zapnologica

1

Bunun bile yararlı olup olmadığını bilmiyorum ama aynı sorunla mücadele ediyordum ve sadece küresel bir boole değişkeni ve onResume () eylemiyle oldukça kolay bir yol buldum. Benim durumumda, C Etkinliğim belirli bir düğmeye tıklanırsa, B Etkinliğinin sonunu () tetiklemelidir!

Etkinlik_A -> Etkinlik_B -> Etkinlik_C

Etkinlik_A (normal olarak açılır Etkinlik_B)

Etkinlik_B (bazı düğmelerde Etkinlik_C açılır):

// Global:
boolean its_detail = false;
// -------
SharedPreferences prefs =  getApplicationContext().getSharedPreferences("sharedpreferences", 0);
boolean v = prefs.getBoolean("select_client", false);

its_detail = v;

startActivity(C);

@Override
public void onResume(){
     super.onResume();
     if(its_detail == true){
        finish();
     }
}

Bu nedenle, C Etkinliği üzerindeki düğmeyi tıkladığımda, B Etkinliğinin "onResume ()" işlevini yerine getirir ve A Etkinliğine geri döner.


1
 @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if ( id == android.R.id.home ) {
            finish();
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

Bu da hem çalışır deneyin araç çubuğu geri düğmesi olarak donanım geri düğmesi .


Bu benim için çalıştı. Ben de bir vardı MainActivity ve SettingsActivity ile android:parentActivityName=".MainActivity"ikinci biri için. Bu kod , araç çubuğundaki Ana Sayfa / Geri düğmesini işler ve yalnızca yığında bir öncekine dönen geçerli etkinliği sonlandırır. Teşekkürler.
mortalis

1

Finish tüm uygulamayı kapatır, bu Android geliştirme nefret ediyorum bir şey değil bitirmek iyi değil ama onlar tamam sözdizimi zekâ yetişmek değil

startActivity(intent)

Neden olmasın

closeActivity (niyet)?


1
Bu soruya cevap veriyor mu? Yoksa bu sadece denenecek bir öneri mi? Her iki durumda da, rant gereksiz ve
SO'da

1

Çok benzer bir durumla karşılaştık.

Etkinlik 1 (Açılış) -> Etkinlik 2 (Önizleme) -> Etkinlik 3 (Detay)

Yanlış "arka baskıda" Yanıtı

  • Etkinlik 3'teki cihaza tekrar basıldığında Etkinlik 2 de kapanır.

Yukarıda gönderilen tüm yanıtları kontrol ettim ve hiçbiri işe yaramadı. Etkinlik 2 ile Etkinlik 3 arasındaki geçişe yönelik Java sözdiziminin doğru olduğu gözden geçirildi.

Üçüncü taraf bir uygulama çağırırken kodlama taze. bir Faaliyet tarafından. Konfigürasyon açısını araştırmaya karar verdik - sonunda sorunun temel nedenini belirlememizi sağladık.

Dürbün : Etkinlik 2'nin konfigürasyonu (arayan).

Kök Neden :

android:launchMode="singleInstance"

Çözüm :

android:launchMode="singleTask"

Görünüşe göre bu "geri baskıda" sorunu üzerinde singleInstance çağrılan Faaliyetler ile bir örnekte çağrılan Faaliyetleri dikkate alırken, singleTask geri çağırmak için gereken kimliğin olması gerektiği gibi çalışması için kendi kimliğine sahip kendi çağrıları olan faaliyetlere izin verecektir.


0
{ getApplicationContext.finish();   }

Bu yöntemi deneyin ..


Bu kod bloğu soruyu cevaplayabilse de, neden böyle yaptığına dair biraz açıklama yapabilirseniz en iyisi olur.
David

0

finish () 'ı çağırıyor olabilirsiniz; düğmesine tıkladıktan hemen sonra ana etkinlik kapatılır ve bir sonraki etkinlikten geri döndüğünüzde ana etkinlik zaten kapalı olduğundan ve etkin etkinlik olmadığından uygulama kapatılır.


0

onCreate etkinliğinizin yöntemi aşağıdaki kodu yazın.

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);

Ardından, etkinliğinizin onOptionsItem seçilen yöntemini aşağıdaki gibi geçersiz kılın

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case android.R.id.home:
            finish();
    }
    return super.onOptionsItemSelected(item);
}

Ve gitmekte fayda var.


0

Bunu MainActivity'nizde kullanmalısınız

 Intent intent = new Intent(context , yourActivity);

            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
            context.startActivity(intent);

Bayrak, MainActivity'nizi koruyacak birden fazla görev başlatacak, finish'i çağırdığınızda diğer etkinliği öldürecek ve sizi MainActivity'ye geri götürecek

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.