Activity.finish () yöntemi tam olarak nedir?


156

Bir süre android uygulamaları geliştiriyorum ve aktivite yaşam döngüsü ve uygulamanın yaşam döngüsü hakkında birçok gönderiyi takip ettim.

Ben Activity.finish()yöntem bir yere şekilde çağırır biliyorum Activity.onDestroy(), ve aynı zamanda aktivite yığından kaldırma, ve bir şekilde işletim sistemi ve çöp toplayıcı işaret onun "hile yapmak" ve bunu yapmak iyi bir zaman bulmak zaman bellek serbest olduğunu tahmin yani....

Bu mesaja geldim - Bir uygulamadan vazgeçmek kaşlarını çattı mı? ve Mark Murphy'nin cevabını okuyun.

finish()Metodun gerçekte ne yaptığı hakkında biraz kafam karıştı .

Aramam finish()ve çağrılmama şansım var mı onDestroy()?


Yanıtlar:


171

Bir finish()etkinliği çağırırken , yöntem onDestroy()yürütülür. Bu yöntem aşağıdaki gibi şeyler yapabilir:

  1. Etkinliğin yönettiği tüm iletişim kutularını kapatın.
  2. Etkinliğin yönettiği tüm imleçleri kapatın.
  3. Açık arama iletişim kutularını kapatın

Ayrıca, onDestroy()bir yıkıcı değil. Aslında nesneyi yok etmez. Bu sadece belirli bir duruma dayalı olarak adlandırılan bir yöntemdir. Böylece örneğiniz, üst sınıf çalıştıktan ve geri döndükten sonra hala hayatta ve çok iyi *. onDestroy()Android, kullanıcının uygulamayı yeniden başlatmak istemesi durumunda işlemleri tutar, bu da başlangıç ​​aşamasını daha hızlı hale getirir. Süreç hiçbir şey yapmayacak ve belleğin geri kazanılması gerekiyorsa, süreç öldürülecek


5
Bu yüzden sadece onDestroy () çağrısını tetikleyen finish () yöntemi ve hepsi bu mu?
Tal Kanel

9
Evet, Aktiviteye geri dönerseniz onCreate () yöntemi çağrılır.
Luis Pena

9
Finish () ayrıca onPause () ve onStop () öğesini çağırır mı?
sr09

36
Tekrar test ettim ve bitirmek () çağrıldıktan sonra onPause (), onStop () ve onDestroy () öğelerinin hepsinin sırayla çağrılacağını buldum.
Sam003

5
@Laurent onPause () ve onStop () her zaman çağrılmaz. Aşağıdaki
Prakash

77

@K_Anas cevabındaki 2 sentim. Finish () yönteminde basit bir test yaptım. Etkinlik yaşam döngüsünde listelenen önemli geri arama yöntemleri

  1. OnCreate () içinde finish () çağrısı : onCreate () -> onDestroy ()
  2. OnStart () içinde finish () çağrısı: onCreate () -> onStart () -> onStop () -> onDestroy ()
  3. OnResume () içinde bitirme () çağrısı: onCreate () -> onStart () -> onResume () -> onPause () -> onStop () -> onDestroy ()

Söylemek istediğim, arasında herhangi bir yöntemle birlikte yöntemlerin muadilleri, finish () yürütüldüğünde çağrılır.

Örneğin:

 onCreate() counter part is onDestroy()
 onStart() counter part is onStop()
 onPause() counter part is onResume()

onPause'da bitirmek çağırırsanız? onStop> onDestroy'u arayacak mı?
rmpt

Bu tablo gerçekten yararlı ve açıklayıcı (biraz aşağı kaydırmanız gerekiyor) developer.android.com/reference/android/app/…
winklerrr

Bu cevabın doğru olduğunu kendim doğruladım.
Sreekanth Karumanaghat

33

Ayrıca, bir niyetten sonra finish () öğesini çağırdığınızda "geri" düğmesiyle önceki etkinliğe geri dönemeyeceğinizi de unutmayın.

startActivity(intent);
finish();

Bu tam olarak ihtiyacım olan bilgidir, çünkü sadece google sürücüsüne bağlanan bir etkinliğim var, o zaman kontrollerini yapıyor ve ana etkinliğe (veya bir hata varsa Ayarlar etkinliğine) geçiyor, bu yüzden kullanıcı geri dönemez.
Francesco Marchetti-Stasi

1
@Francesco Marchetti-Stasi Sizin durumunuzda, onBackPressed () 'i geçersiz kılmak ve kullanıcının geri dönmemesi gerekiyorsa super.onBackPressed () öğesini çağırmamak daha iyi olur.
Paul

13

onDestroy()son temizlik - kendi başınıza yapabileceğiniz kaynakları boşaltmak, açık bağlantıları, okuyucuları, yazarları vb. kapatmak içindir. Geçersiz kılmazsanız, sistem gerekeni yapar.

Öte yandan, finish()sistem programcının akımın Activitybitmesini istediğini bilmesini sağlar . Ve bundan onDestroy()sonra çağırıyor .

Dikkat edilmesi gereken bir şey:

yalnızca bir çağrının finish()tetiklenmesi gerekli değildir onDestroy(). Hayır. Bildiğimiz gibi, android sistemi, serbest bırakılması gereken akımın ihtiyaç duyduğu kaynaklar olduğunu hissediyorsa faaliyetleri öldürmek için ücretsizdir Activity.


1
Bu finish () işlevini, etkinliğin tamamlanması gerektiğini sisteme bildirin. yani "do x = sisteme x yapmasını söyle" demek gibidir. saniye şey: Cevabınızdan bitirmek () çağırmak için bir yol var gibi görünüyor ve sistem onDestroy () çağırmak için karar verecektir? mümkün mü?
Tal Kanel

İlk kısmı doğru yaptınız. Arama finish(), sisteme işlemi bitirmesini söylüyor Activity. do ifadenizdeki "x" kısmı "bitirmek (yok etmek) Activity" dir. İkinci kısım yanlış. Aslında orada bir kelimeyi kaçırdım. Cevabı düzenledim. onDestroy()sadece tetiklenmez finish(), sistem kendi başına da diyebilir.
Kazekage Gaara

1
Cevaba eklemenizi okudum. Şimdilik cevabınızı çok beğendim, çünkü açıklamanızı ilginç buldum, ama başkalarının "answerd" olarak işaretlemeden önce söyleyecek başka bir şeyleri olup olmadığını görmek istiyorum. Şimdilik teşekkürler :)
Tal Kanel

Bitirmeden () sonra, bu aktivitedeki tüm değişkenler yok edilir, değil mi? Bu etkinliğe bir kez daha geldiğimde, yeniden ilan edilecek veya başlatılacak, değil mi?
Sibbs Kumar

3
Not: sistem işlemi öldürürse, onDestroy çağrılmayabilir. developer.android.com/reference/android/app/…
Kevin Lee

9

Finish () yöntemi geçerli etkinliği yok eder. Kullanıcı geri düğmesine bastığında bu etkinliğin tekrar tekrar yüklenmesini istemediğiniz durumlarda bu yöntemi kullanabilirsiniz. Temel olarak etkinliği mevcut yığından temizler.


8

Yukarıdaki @rommex cevabına ek olarak finish(), Aktivitenin yok olmasını sıraya koyan ve Faaliyet önceliğine bağlı olduğunu da fark ettim .

finish()Sonra ararsam onPause(), görürüm onStop()ve onDestroy()hemen ararım .

Ben ararsam finish()sonra onStop(), ben görmüyorum onDestroy()5 dakika sonrasına kadar.

Benim gözlemimden, bitirmek sıraya dizilmiş gibi görünüyor ve baktığımda adb shell dumpsys activity activitiesayarlandı finishing=true, ama artık ön planda olmadığı için imha için öncelikli değildi.

Özetle, onDestroy()hiçbir zaman çağrılması garanti edilmez, ancak çağrıldığında bile gecikebilir.


5

Çeşitli yanıtlar ve notlar, finish () öğesinin onPause () ve onStop () 'yı atlayabildiğini ve doğrudan onDestroy () öğesini yürütebileceğini iddia ediyor. Dürüst olmak gerekirse, bu konudaki Android dokümanları ( http://developer.android.com/reference/android/app/Activity.html ) "Etkinlik bitiyor ya da sistem tarafından yok ediliyor" diyor ki bu oldukça belirsiz ancak finish (), onDestroy () öğesine atlayabilir.

Finish () üzerindeki JavaDoc benzer şekilde hayal kırıklığı yaratıyor ( http://developer.android.com/reference/android/app/Activity.html#finish () ) ve bitirmeye yanıt olarak hangi yöntemlerin çağrıldığını aslında not etmiyor ().

Bu yüzden girişte her durumu kaydeden bu mini uygulamayı aşağıda yazdım. Finish () öğesini çağıran bir düğme içerir - böylece hangi yöntemlerin tetiklendiğini kaydedebilirsiniz. Bu deney, finish () öğesinin gerçekten de onPause () ve onStop () öğesini çağırdığını önerecektir. İşte ben çıktı:

2170-2170/? D/LIFECYCLE_DEMO INSIDE: onCreate
2170-2170/? D/LIFECYCLE_DEMO INSIDE: onStart
2170-2170/? D/LIFECYCLE_DEMO INSIDE: onResume
2170-2170/? D/LIFECYCLE_DEMO User just clicked button to initiate finish() 
2170-2170/? D/LIFECYCLE_DEMO INSIDE: onPause
2170-2170/? D/LIFECYCLE_DEMO INSIDE: onStop 
2170-2170/? D/LIFECYCLE_DEMO INSIDE: onDestroy

package com.mvvg.apps.lifecycle;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;

public class AndroidLifecycle extends Activity {

    private static final String TAG = "LIFECYCLE_DEMO";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "INSIDE: onCreate");
        setContentView(R.layout.activity_main);
        LinearLayout layout = (LinearLayout) findViewById(R.id.myId);
        Button button = new Button(this);
        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View view) {
                Toast.makeText(AndroidLifecycle.this, "Initiating finish()",
                        Toast.LENGTH_SHORT).show();
                Log.d(TAG, "User just clicked button to initiate finish()");
                finish();
            }

        });

        layout.addView(button);
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "INSIDE: onStart");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "INSIDE: onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "INSIDE: onDestroy");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "INSIDE: onPause");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "INSIDE: onResume");
    }

}

3

@ user3282164 Aktivite yaşam döngüsüne göre onPause()-> onStop()->onDestroy() çağrı üzerinefinish() .

Diyagramda [Etkinlik Çalışıyor] 'dan [onDestroy() ]' a kadar sistemin neden olduğu .

onStop () doc, " Sistemin onPause () yöntemi çağrıldıktan sonra etkinliğini sürdürmek için yeterli belleğe sahip olmadığı düşük bellek durumlarında bu yöntemin hiçbir zaman çağrılamayabileceğini unutmayın. "



2

Çalışmam, finish()yöntemin aslında kuyruğa bazı imha işlemleri yerleştirdiğini, ancak Faaliyetin hemen yok edilmediğini gösteriyor. Yıkım planlanıyor.

Bir yerden Örneğin, finish()içinde onActivityResult()iken, geri arama onResume()çalıştırmak için henüz, daha sonra ilk onResume()ve ancak bundan sonra, idam edilecektir onStop()ve onDestroy()denir.

NOT: belgelerdeonDestroy() belirtildiği gibi hiç çağrılmayabilir .


2

onCreate () 'de bitirmek, @prakash'ın dediği gibi onDestroy ()' u doğrudan çağırmaz. finish()Eğer Android'e kontrolünü dönünceye kadar operasyon bile başlamaz.

İçinde bitirmek () çağrılması onCreate () : onCreate () -> onStart () -> onResume () . Kullanıcıdan çıkılırsa uygulama -> onPause () -> onStop () -> onDestroy ()

OnStart () içinde finish () çağrısı : onCreate () -> onStart () -> onStop () -> onDestroy ()

OnResume () içinde bitirme () çağrısı : onCreate () -> onStart () -> onResume () -> onPause () -> onStop () -> onDestroy ()

Bu diğer referans onay görünüm için OnCreate sürekli sonra bitirmek & Mat ()


0

Görünüşe göre buradaki tek doğru cevap romnex tarafından verildi: "onDestroy () hiç çağrılmayabilir". Her ne kadar pratikte olsa da, hemen hemen her durumda, hiçbir garanti yoktur: finish () ile ilgili belgeler sadece aktivitenin sonucunun arayan kişiye geri yayılacağına söz verir, ancak başka bir şey değildir. Ayrıca, yaşam döngüsü belgeleri , onStop () biter bitmez (veya daha eski cihazlarda daha önce), faaliyetin basit bir testte gözlemlenmesi olası ve bu nedenle nadir de olsa, faaliyetin, onDestroy () yürütülürken veya daha önce öldürülebilir.

Bu nedenle, finish () öğesini çağırdığınızda bazı işlerin yapıldığından emin olmak istiyorsanız, onDestroy () içine koyamazsınız, ancak gerçekten çağırmadan hemen önce, finish () adını verdiğiniz yerde yapmanız gerekir.


-4

finish () sadece android'deki önceki etkinliğe geri gönderir veya uygulamada bir adım geri gittiğini söyleyebilirsiniz

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.