Android yok eden etkinlikler, öldürme süreçleri


117

Merhaba Android'in belleği nasıl yönettiğini merak ediyorum ve hiçbir yerde kesin bir cevap bulamıyorum. Mevcut aktivite yığınında 5 aktiviteye sahip bir uygulamam olduğunu varsayalım (4'ü durduruldu ve 1'i devam ettirildi), bağlı servis yok. Tüm aktivitelerimin durması için HOME düğmesine basıyorum. Başka bir bellek tüketen uygulamayı başlatıyorum ve genel cihaz belleği azalmaya başlıyor. Ve soru şu ki

... Başvuruma ne olacak?

  1. Sistem hafızayı kurtarmak için etkinliklerimden yalnızca birini veya bazılarını yok edebilir mi?
  2. Sistem başvurumun tüm sürecini öldürecek mi? Tüm faaliyetler güzelce yok edilecek mi?
  3. Tamamen öldürüldüğünde başvuruma geri döndüğümde ne olacak? Başlangıçtan başlayacak mı (ilk başlangıç ​​gibi) veya etkinlikleri önceki duruma getirmeye çalışacak mı / eğer evet ise - yığının sadece en üstünde mi yoksa hepsi mi?

GÜNCELLEME:

Bu soruyu sormadan önce Aktivite yaşam döngüsünü birkaç kez gördüm ancak sorularıma cevap vermiyor. Bazı testler yaptım ve bazı cevaplarım var. DDMS'deki "durdurma süreci" test için bir ipucuydu.

1. soru için cevabı test etmedim, ancak rehberin dediği gibi:

Bir etkinlik duraklatılırsa veya durdurulursa, sistem etkinliği bitirmesini isteyerek veya yalnızca işlemini sonlandırarak bellekten çıkarabilir.

Görünüşe göre bir veya daha fazla faaliyet, süreci sonlandırmadan nazikçe (onDestroy yöntemi ile) yok edilebilir. Onlara geri döndüğünüzde (onCreate + bundle) alacaksınız.

Soru 2 cevabı:

EVET. Genel olarak sistem, tüm süreci sonlandırır, bu, etkinlikler ve statik alanlar dahil tüm verilerin yok edildiği anlamına gelir. Bu iyi bir şekilde YAPILMAZ - duraklatılan / durdurulan etkinliklerinizden herhangi biri için onDestroy veya finialize () yapamazsınız. Bu nedenle, saveInstanceState () onPause yönteminden hemen önce çağrılır. onPause, temelde bir şeyi kaydetmeniz gereken son yöntemdir çünkü bu yöntemden sonra onStop veya onDestroy'u asla göremezsiniz. Sistem, tuttukları ve yaptıkları her ne olursa olsun tüm nesnelerinizi yok ederek süreci öldürebilir.

Soru 3 cevabı:

Öldürülen bir başvuruya döndüğünüzde ne olacak?

  • Android 2.2'den önce - uygulama, başlatıcı etkinliğiyle birlikte başlayacaktır.
  • 2.2'den başlayarak - sistem önceki uygulama durumunu geri yükleyecektir. Bu ne demek? Bu, son görünür etkinliğin yeniden oluşturulacağı anlamına gelir (onCreate + bundle). Etkinlik yığınına ne olacak? Yığın iyi ama üzerindeki tüm aktiviteler öldü. Geri düğmesiyle geri döndüğünüzde her biri yeniden oluşturulacak (onCreate + bundle). Bununla ilgili bir şey daha var:

Normalde, kullanıcı bu görevi ana ekrandan yeniden seçtiğinde, sistem belirli durumlarda bir görevi temizler (kök etkinliğin üzerindeki yığındaki tüm etkinlikleri kaldırır). Bu genellikle, kullanıcı görevi 30 dakika gibi belirli bir süre boyunca ziyaret etmediyse yapılır.

Sonuç?

  1. Aktivite rotasyonu sorunlarını çözmenin android: configChanges = "orientation" ile çözülebileceğini düşünmeyin. Bunu yaptığınızda, farkında bile olmadığınız birçok sorunla karşılaşırsınız.
  2. Uygulamanızı DDMS ile test edin - İşlemi durdur düğmesi. Bunu gör
  3. Statik değişkenleri kullanırken dikkatli olun. Bunları aktivite 1'de başlattığınızda - onları aktivite 2'de başlatacağınızı düşünmeyin. Global statiği başlatmak için tek güvenli yer Uygulama sınıfı olacaktır.
  4. OnStop veya onDestroy'u asla göremeyeceğinizi unutmayın. Dosyaları / veritabanlarını kapatın, indiricileri durdurun onPause. Uygulamanın BG'de bir şey yapmasını istediğinizde - Ön Plan Hizmetini kullanın.

Öyle olurdu ... Umarım eseyime yardım etmişimdir :)


Tahmininize göre, bu 5 etkinlik aynı uygulamadan mı yoksa birkaç farklı uygulamadan mı geliyor?
beceriksizler

1
"Mevcut aktivite yığınında 5 aktiviteye sahip bir uygulamam var" Elbette hepsi tek, aynı süreç uygulamamdan.
Mark

4
Teşekkürler bu da benim sorumdu ... Sorunuz ve cevapları bana oldukça yardımcı oldu.
craigrs84


@Mark: Bu sorun şimdi çözüldü mü? Nasıl ise?
Ameer Moaaviah

Yanıtlar:


30

Öncelikle lütfen şuna bir göz atın:

img1

onPause () Sistem önceki bir aktiviteyi sürdürmeye başlamak üzereyken çağrılır. Bu genellikle kalıcı verilere kaydedilmemiş değişiklikleri işlemek, animasyonları durdurmak ve CPU tüketen diğer şeyleri vb. Yapmak için kullanılır. Bu yöntemin uygulamaları çok hızlı olmalıdır çünkü bu yöntem geri dönene kadar bir sonraki faaliyete devam edilmeyecektir. Bunu, etkinlik öne dönerse onResume () veya kullanıcı tarafından görünmez hale gelirse onStop () izler.

onStop () Etkinlik, başka bir etkinlik devam ettirildiği ve bu etkinliği kapsadığı için kullanıcı tarafından artık görünür olmadığında çağrılır. Bu, yeni bir faaliyetin başlatılması, mevcut bir faaliyetin bunun önüne getirilmesi veya bu faaliyetin yok edilmesi nedeniyle olabilir. Ardından, bu etkinlik kullanıcıyla etkileşim kurmak için geri dönüyorsa onRestart () veya bu etkinlik kayboluyorsa onDestroy () izler.

Cihazınızda "ANA" düğmesine bastığınızda Yani, mevcut ön plan aktivitesi üzerine konur onPause()sonra onStop(), diğer 4 kalmalıdıronStop()

Google'ın Belgelerine Göre:

  • Ekranın ön planında (yığının en üstünde) bir etkinlik varsa, o etkindir veya devam etmektedir.
  • Bir etkinlik odağı kaybetmişse ancak hala görünür durumdaysa (yani, yeni, tam boyutlu olmayan veya şeffaf bir etkinlik, etkinliğinizin üstüne odaklanırsa), duraklatılır. Duraklatılmış bir etkinlik tamamen canlıdır (tüm durum ve üye bilgilerini korur ve pencere yöneticisine bağlı kalır), ancak aşırı düşük bellek durumlarında sistem tarafından sonlandırılabilir.
  • Bir etkinlik, başka bir etkinlik tarafından tamamen gizlenmişse, durdurulur. Halen tüm durum ve üye bilgilerini saklar, ancak artık kullanıcı tarafından görülemez, bu nedenle penceresi gizlidir ve başka bir yerde belleğe ihtiyaç duyulduğunda genellikle sistem tarafından öldürülür.
  • Bir etkinlik duraklatılırsa veya durdurulursa, sistem etkinliği bitirmesini isteyerek veya yalnızca işlemini sonlandırarak bellekten çıkarabilir. Kullanıcıya tekrar görüntülendiğinde, tamamen yeniden başlatılmalı ve önceki durumuna geri yüklenmelidir.

Ve süreç yaşam döngüsü için:

Süreç Yaşam Döngüsü 3. Bir arka plan etkinliği (kullanıcı tarafından görülemeyen ve duraklatılan bir etkinlik) artık kritik değildir, bu nedenle sistem, diğer ön plan veya görünür işlemler için belleği geri kazanmak üzere sürecini güvenli bir şekilde sonlandırabilir. İşleminin sonlandırılması gerekiyorsa, kullanıcı etkinliğe geri döndüğünde (ekranda tekrar görünür kılarak), onCreate (Bundle) yöntemi, daha önce onSaveInstanceState (Bundle) içinde sağlanmış olan SavedInstanceState ile çağrılacaktır. kullanıcının son bıraktığı durumda kendini yeniden başlatabilir.

Yukarıdaki tüm alıntılar şunlardan geliyor: Android Geliştiricileri Referansı: Etkinlik

Bazı bellek tüketen uygulamaları başlattığınızda, sistemin etkin olmayan etkinlikleri yok edebileceği ve bellekleri geri dönüştürebileceği onaylanmıştır. Ve aşağıdakileri uygulayabilirsiniz: isFinishing()Aktivitenizde ve ardından hangi aktivitelerinizin sistem tarafından bırakıldığını tespit etmek için DDMS'deki "öldür" düğmesini kullanın. Ama sanırım sistem önce en eskisini yok edecek. Ancak, "Başlatma Etkinliği" geri dönüştürüldüğünde diğer etkinlikleri sürdürmenin bir anlamı yoktur.

GÜNCELLEME

İşte buradan bulduğum bazı görüşler :

Durdurulmuş durum

Bir etkinlik görünür olmadığında, ancak yine de hafızada olduğunda, durmuş durumda olduğunu söyleriz. Durdurulan aktivite tekrar bir Koşu aktivitesi haline getirilebilir. Ya da yok edilebilir ve bellekten kaldırılabilir.

Sistem, etkinlikleri durdurulmuş durumda tutar, çünkü kullanıcı yine de yakın zamanda bu etkinliklere geri dönmek isteyecektir ve durdurulmuş bir etkinliği yeniden başlatmak, bir etkinliği sıfırdan başlatmaktan çok daha ucuzdur. Bunun nedeni, belleğe yüklenmiş tüm nesnelere zaten sahip olmamız ve hepsini ön plana çıkarmamız gerektiğidir.

Durdurulan etkinlikler herhangi bir noktada bellekten kaldırılabilir.


4
Dokümantasyon bu konuda oldukça kafa karıştırıcıdır, ancak tek tek bileşenler (faaliyetler, hizmetler vb.) Değil, yalnızca tüm bir süreç kapatılabilir. Bakınız: stackoverflow.com/questions/7536988/…
greg7gkb

Bu soru @ greg7gkb yorum bağlantısındaki bilgilerle güncellenmelidir, yanıltıcıdır
Luke De Feo

1

Sistem hafızayı kurtarmak için etkinliklerimden yalnızca birini veya bazılarını yok edebilir mi?

Evet. Android, belleğe ihtiyaç duyulduğunda arka planda çalışan etkinlikleri öldürür. Birini veya tümünü öldürmek bazı koşullara bağlı olabilir. Örneğin, duraklatılan veya durdurulan bir örnek, android'in bir etkinliği veya işlemi kendisi öldürmesine neden olabilir. Burada Etkinlik Yaşam Döngüsü altında aşağıdaki noktaları alabilirsiniz. O sayfayı tamamen gözden geçirmenizi tavsiye ederim. Kesinlikle şüphelerinizi giderecek.

Bir etkinlik odağı kaybetmişse ancak hala görünür durumdaysa (yani, yeni, tam boyutlu olmayan veya şeffaf bir etkinlik, etkinliğinizin üstüne odaklanırsa), duraklatılır. Duraklatılmış bir etkinlik tamamen canlıdır (tüm durum ve üye bilgilerini korur ve pencere yöneticisine bağlı kalır), ancak aşırı düşük bellek durumlarında sistem tarafından sonlandırılabilir.

Bir etkinlik, başka bir etkinlik tarafından tamamen gizlenmişse, durdurulur. Halen tüm durum ve üye bilgilerini saklar, ancak artık kullanıcı tarafından görülemez, bu nedenle penceresi gizlidir ve başka bir yerde belleğe ihtiyaç duyulduğunda genellikle sistem tarafından öldürülür.

Bir etkinlik duraklatılırsa veya durdurulursa, sistem etkinliği bitirmesini isteyerek veya yalnızca işlemini sonlandırarak bellekten çıkarabilir. Kullanıcıya tekrar görüntülendiğinde, tamamen yeniden başlatılmalı ve önceki durumuna geri yüklenmelidir.


Sistem başvurumun tüm sürecini öldürecek mi? Tüm faaliyetler güzelce yok edilecek mi?

Etkinlik bir bireyle ilgilidir, süreç ise faaliyetler grubuyla ilgilidir. Yukarıdaki üçüncü noktaya tekrar bakın, söz konusu süreci durdurur.


Tamamen öldürüldüğünde başvuruma geri döndüğümde ne olacak?

Yeniden başlatmaya benzer. Yine üçüncü nokta size şu yanıtları verecektir:When it is displayed again to the user, it must be completely restarted and restored to its previous state

Hafızayla ilgili konular hakkında daha fazla bilgiyi buradan edinebilirsiniz .

Düzenleme:
Bir uygulamadaki tüm etkinlikler tek bir süreçte çalışır. Yani bir işlem öldürüldüğünde 5 veya 10 fark etmeksizin tüm faaliyetler öldürülür, yani yeniden başlatılır. Yeniden başlatma, uygulamanızın kaydedilmiş durum olmadan baştan başlamasına neden olur.


2
Activity Lifecycle'ı en az 5 kez izledim ama sorularıma cevap vermiyor. Söylediğin şey, uygulama sürecim sona erdiğinde - uygulamaya geri döndüğümde önceki durumuna geri yüklendiği anlamına geliyor. Öyleyse, 5 durdurulmuş faaliyetim olduğunda .. süreç öldürüldüğünde hepsi öldü mü (Yok Edildiğinde)? Uygulamama geri döndüğümde, tüm etkinlikler geri yüklendi mi (onCreate + paket) veya yalnızca yığının en üstünde olan (kullanıcı tarafından görülebilir) mi?
Mark

1
Bir uygulamadaki tüm aktiviteler tek bir süreçte çalışır. Yani bir işlem öldürüldüğünde 5 veya 10 fark etmeksizin tüm faaliyetler öldürülür, yani yeniden başlatılır. Yeniden başlatma, uygulamanızın kaydedilmiş durum yokken baştan başlamasına neden olur ..
Vinay

1
Neredeyse doğru, ancak 2.2 ve üstü için değil. Sayfanın üst kısmında GÜNCELLEMEYE bakın.
Mark

1
Hayır, bu doğru değil ve asla doğru olmadı. Belgelere göre kafa karıştırıcı, ancak bakınız: stackoverflow.com/questions/7536988/…
greg7gkb

2
@JJPA Android, belleği geri kazanmak için tek bir Etkinliği yok edemez, yalnızca süreçleri yok eder. "Bellek dışı katil" uygulamasında yer alan Android çekirdek ekip üyesi Dianne Hackbor'un bu cevabına bakın: stackoverflow.com/a/7576275/1290264 .
bcorso
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.