Android Aktivitelerinin onPause () ve onStop () arasındaki fark nedir?


155

Buradaki android doc'tan http://developer.android.com/reference/android/app/Activity.html , 'Etkinlik ön plana çıkıyor' diyecek onPause()ve 'Etkinlik artık görünür değil' arayacak onStop().

'Etkinlik ön plana çıkıyor' ile 'Etkinlik artık görünür değil mi? Bana aralarındaki farkın ne olduğunu söyleyebilir misiniz?


18
Mükemmel bir soru için +1. Ayrıca, bir pausedetkinlik tamamen canlıdır (tüm durum ve üye bilgilerini korur ve pencere yöneticisine bağlı kalır). Bir stoppedetkinlik aynı zamanda tüm eyalet ve üye bilgilerini saklar, ancak artık window manager.
ateiob

Yanıtlar:


110

Hayır, eğer bazı faaliyetler ön plana çıkarsa, bu diğer faaliyetin tamamen görünmez olduğu anlamına gelmez. Şu durumu düşünün:

Tema temalı etkinlik.

Burada her iki etkinliği de aynı anda görüyoruz. Alanlarla ilgili ilk etkinlik başka bir etkinlik tarafından engellenir ve kullanıcı artık bununla etkileşime giremez. Bununla birlikte, sonuçta ortaya çıkan tüm sonuçlarla birlikte hala görülebilir.

Bu, hangi etkinliğin tamamen opak olduğu ve tüm ekranı kapladığı ve hangisinin olmadığı sorusu bırakır. Bu karar, etkinliği içeren pencereye dayanmaktadır. Pencerede windowIsFloatingveya işareti varsa, windowIsTranslucentetkinliğin temeldeki öğeleri görünmez kılmadığı, aksi takdirde onStop()çağrılmasına neden olur ve neden olur . İlgili kod şurada bulunabilir com.android.server.am.ActivityRecord:

fullscreen = ent != null && !ent.array.getBoolean(
        com.android.internal.R.styleable.Window_windowIsFloating, false)
        && !ent.array.getBoolean(
        com.android.internal.R.styleable.Window_windowIsTranslucent, false);

10
Kısmi ve toplam (içeri) görünürlüğe odaklanan harika bir açıklama için +1. Android'in onPause()ve arasında karar vermesini sağlayan ekranın eşik yüzdesini bilmek ilginç olurdu onStop(). % 100 mü? Önceki etkinlikten yalnızca bir piksel görünüyorsa, hala onPause()mı?
ateiob

3
@ateiob Hiçbir yerde söylenmiyor ama ben öyle düşünüyorum. Bununla birlikte, genellikle açıktır çünkü tüm ekranı doldurmayan çoğu etkinlik, diyaloglar için sistem tarafından sağlanan stillerden birini kullanır.
Malcolm

1
Garip, ancak uygulamamda onPause()bir iletişim kutusu görüntülendiğinde hiç çağrılmıyor. onPause()sadece ana sayfa düğmesine bastığımda çağrılıyor . Bu nasıl mümkün olabilir?
ateiob

Bu doğru cevap olmalı. Bu arada, ön plandaki şey bir diyalog mu yoksa faaliyet mi?
Sam YC

3
@GMsoF Bir etkinlik. Esas nokta bu: her diyalog aslında bir diyalog değildir. Bir aktivitenin iletişim kutusu gibi görünmesini sağlayabilirsiniz, böylece aslında tüm ekrandan daha küçük olur.
Malcolm

40

Hala herhangi bir bölümünü görebiliyorsanız ( Activityön plana gelmek ya tüm ekranı kaplamıyorsa ya da bir şekilde şeffafsa) onPause()çağrılacaktır. Herhangi bir kısmını göremezseniz, onStop()aranacak.

Örneğin, bir diyalog ** öncekinin tamamını kapsamayabilir Activityve bu onPause()çağrılma zamanı olabilir.

** Burada bir Android İletişim Kutusundan bahsetmiyorum, daha çok ortaya çıkan ve kullanıcı ekranının yalnızca bir kısmını gizleyen bir şeyin kavramsal fikrinden bahsediyorum. Bu not, aşağıdaki @GMsoF tarafından yapılan bir yoruma göre açıklığa kavuşturmak için eklendi


33
HAYIR. Bu yanıltıcıdır. Gösterilen bir iletişim kutusu onPause () 'u çağırmayacak çünkü iletişim kutusu mevcut etkinliğin bağlamını kullanıyor, etkinliği canlı olarak kabul edin.
Sam YC

6
@GMsoF Diyalog dediğimde kulağa DialogAndroid dersinde olduğu gibi demek istediğimi düşündün . Bununla birlikte, benim ulaştığım şey Activity, tüm yenilerin bir öncekini Activitytamamen örtmesi gerekmediği fikrini açıklayan ilk kişiyi kısmen gizleyen bir şey .
nicholas.hauschild

11

Ön planda olmak, etkinliğin girdi odağına sahip olduğu anlamına gelir. Örneğin, bir etkinlik odaklanmış bir iletişim kutusu tarafından görülebilir ancak kısmen gizlenebilir. Bu durumda onPause()aranacak ama değil onStop(). İletişim kutusu kapandığında, etkinliğin onResume()yöntemi çağrılacaktır (ancak değil onStart()).


5
Diyalog olayı yanıltıcı olabilir. Bu aktivitenin ana UI iş parçacığından bir uyarı diyalogu açalım, bu durumda onPause () çağrılmayacaktır. Sadece bu iletişim kutusu başka Aktiviteden veya başka Uygulamadan açılırsa.
Sam003

1
@Zhisheng - Yorumunuza katılıyorum. Aktiviteler kılavuzu konusunu başka kelimelerle ifade ediyordum : " onPause()cihaz uykuya geçtiğinde veya bir iletişim kutusu göründüğünde çağrılır" . As Konuyu anlaşılır kılmakta olsa da, bir iletişim gelmez ille (bir, diyelim olacağını ancak bir etkinlik durdurulmuş olduğu anlamına Bir iletişim kutusu olarak aktivite ).
Ted Hopp

11

Pratik olarak , "onPause ()" ve "onPause () + onStop ()" arasındaki fark dikkate alınmalıdır .

Yeni bir faaliyet meydana geldiğinde ve Ekranın bir kısmını kapladığında. Yani daha önce yaptığınız aktiviteler bir dereceye kadar hala görülebilir. Bu durumda, daha önce çalışan aktivite Back Stack'a gönderilmez. Yani burada sadece onPause () yöntemi çağrılır .

Diğer taraftan, bazı yeni Aktiviteler oluşursa ve tam ekranı kaplarsa, daha önce devam eden aktiviteniz kaybolur. Bu durumda, daha önce çalışan aktiviteniz Back Stack'a taşınır. Burada onPause () + onStop () çağrılır.

Özetlere-

onPause () - Ekran kısmen diğer yeni etkinliklerle kaplıdır. Etkinlik, Arka Yığın'a taşınmaz.

onPause () + onStop () - Ekran, diğer yeni etkinliklerle tamamen kaplıdır. Etkinlik, Arka Yığın'a taşınır.

Back Stack hakkında daha fazla bilgi edinin .


0

Kısaca:

onStop()Önceki aktivite yaşam döngüsü yöntemi, başka bir aktivite gösterildiğinde çağrılır. Aktivitenin tepesinde Diyalog olduğunda onPause(), çağrılır.

Not : Etkinlikler, tüm ekranınızı kaplayan bileşenlerdir.

Not : Diyaloglar ekranı tamamen doldurmadıkları için Aktivite değildir.


0

OnPause ve onStop yöntemleriyle birçok sorunla karşılaştım ve bu nedenle karşılaştığım üç senaryoyu temizleyeceğim -
1. En son uygulama düğmesine tıkladığınızda, yaşam döngüsü yöntemi çağrılmaz, ancak onWindowFocusChanged (boolean hasFocus) hasFocus değeriyle çağrılır yanlış olarak geçti. 5'ten önceki android sürümünde, son uygulama düğmesine basıldığında onPause yöntemi çağrılmak için kullanılır.

2. Etkinliğinizin üzerinde açılır pencere benzeri bir etkinlik göründüğünde, Malcolm tarafından belirtildiği gibi , onPause düğmesi çağrılır. Tüm ekranı kaplayan yeni etkinlik çağrılırsa, önceki etkinlikte onStop çağrılır. Android izin iletişim kutusu , etkinliğinizin onPause'u çağırmasına da neden olur.

3.Etkinliğinizde ekran zaman aşımına uğrarsa, onPause çağrılır. Bir süre sonra ekranı açmazsanız onStop çağrılacaktır.

Ayrıca ateiob tarafından belirtilen cevabı tamamlayan önemli bir şey

Duraklatılmış bir etkinlik tamamen canlıdır (tüm durum ve üye bilgilerini korur ve pencere yöneticisine bağlı kalır). Durdurulmuş bir etkinlik de tüm durum ve üye bilgilerini saklar, ancak artık pencere yöneticisine eklenmez


Umarım yardımcı olur.


0

Yeni bir ETKİNLİK başladığında, önceki faaliyetler onPauseher koşulda meydan okurcasına çağrılacaktır.

aslında iki durum olacak:

1- Önceki etkinliğin bir bölümü görünür durumda veya yeni etkinlik şeffaf: yalnızca onPauseçağrılacak.

2- önceki aktivitesi tamamen yeni bir aktivite ile kaplıdır: Her iki onPauseve onStopçağrılır

---- Bazı notları belirtmek güzel:

NOT 1: HİÇBİRİ etkinliğinin üstünde bir iletişim kutusu başlarsa onPauseveya onStopçağrılırsa.

NOT 2: Teması iletişim kutusuna ayarlanmış bir Aktivite ise, davranış normal bir aktivite gibi olacaktır.

NOT 3: görünüşe göre, hatmi neden olacağından izin iletişim kutusu gibi bir sistem iletişim kutusu onPause.


-5

Evet, anlamaya çalışıyorum ve bunu aşağıda açıklayabilirim:

2 etkinlik vardır: EtkinlikA ve EtkinlikB

public class ActivityA extends Activity implements OnClickListener {

// button
private Button mBtnChangeActivity;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_a);
    initialize();
    setEvent();
}

private void initialize() {
    Log.i("Activity A", "Initialize()");
    mBtnChangeActivity = (Button) findViewById(R.id.btn_change_activity);
}

private void setEvent() {
    Log.i("Activity A", "setEvent()");
    mBtnChangeActivity.setOnClickListener(this);
}

@Override
protected void onStart() {
    super.onStart();
    Log.i("Activity A", "onStart");
}

@Override
protected void onResume() {
    super.onResume();
    Log.i("Activity A", "onResume");
}

@Override
protected void onPause() {
    super.onPause();
    Log.i("Activity A", "onPause");
}

@Override
protected void onStop() {
    super.onStop();
    Log.i("Activity A", "onStop");
}

@Override
protected void onDestroy() {
    super.onDestroy();
    Log.i("Activity A", "onDestroy");
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.btn_change_activity:
        Intent activityB = new Intent(this, ActivityB.class);
        startActivity(activityB);
        break;
    default:
        break;
    }
}

İşte B etkinliği. Yorumumu kodda takip et

public class ActivityB extends Activity implements OnClickListener {

// button
private Button mBtnChangeActivity;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_a);
    initialize();
    setEvent();
    // if call finish() here, activityA will don't stop, just pause
    // Activity A will call onStop() when Activity B call onStart() method
    finish();
}

private void initialize() {
    Log.i("Activity B", "Initialize()");
    mBtnChangeActivity = (Button) findViewById(R.id.btn_change_activity);
}

private void setEvent() {
    Log.i("Activity B", "setEvent()");
    mBtnChangeActivity.setOnClickListener(this);
}

@Override
protected void onStart() {
    super.onStart();
    Log.i("Activity B", "onStart");
}

@Override
protected void onResume() {
    super.onResume();
    Log.i("Activity B", "onResume");
}


@Override
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.btn_change_activity:
        finish();
        break;
    default:
        break;
    }
}
}

Umarım bu açıktır


her zaman bunun mantıklı olduğunu açıklamaya çalışın
Alexander Zaldostanov
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.