Bir uygulamayı en son uygulamalar listesinden çıkardığınızda gerçekte ne olur?


147

Ice Cream Sandwich'deki en son uygulamalar listesi, uygulamaları listeden dışarı kaydırma yeteneğini ekledi, bu sayede uygulamaları kalıcı olarak reddetti (ve bunun bir vanilya işlevi olduğunu bildiğim kadarıyla bir CM / custom ROM olanı değil). Dokümantasyon ve platformun öne çıkan özellikleri, bu işlevselliğin başlık altındaki çalışmalarını kapsayacak gibi görünmüyor, ancak sistemin gerçekte ne yaptığını bilmek merak ediyorum.

Merakımı daha da ekleyerek hızlı bir test yapmaya karar verdim: Bir CM9 kurulumunda Music'i başlattım, sonra geri çektim. Daha sonra son uygulamalar listesine baktım ve gerçekten orada olduğunu gördüm (ve küçük resme göre uygun durumda). Sonra girdim Settings->Applicationsve zorla Müzik uygulamasını durdurdum, ancak son listede hala yer aldı, bu da arka planda kalan süreçlerle bağlantılı olmadığına inanmamı sağladı.

Şimdi Müzik'in kötü bir seçim olabileceğini fark ederek, USA Today uygulamasıyla da test ettim. Bu temelde aynı davranışı sergiledi ve son uygulama listesindeki küçük resim bunu yansıtmasa da (önbellek, tahmin ediyorum?) Zorla durduktan sonra "yeniden başlatılması" gerektiğine benziyordu.

Peki, bir uygulamayı son listeden çıkardığınızda işletim sistemi düzeyinde ne oluyor? Uygulamanın verilerini RAM’den çıkarması ve çöplerin toplanıp kaydedilmiş durumunu yok etmesi basitçe mümkün mü?

Yanıtlar:


68

Son uygulamalar listesinden uygulamaları kaydırmak vanilyadır ve evet, iyi bir şekilde belgelenmemiş. Bu, çeşitli Android forumlarında iyi bir tartışma konusu haline geldi ... fikir birliği burada, bazı yorumlarda en iyi şekilde açıklanmış gibi görünüyor : davranışın, bir uygulamayı kapatmakla tamamen aynı olmadığı, genel olarak ( açık geri düğmesi işlemeyi tanımlamamış uygulamalar için), uygulamadan çıktığınız bir uygulamanın içinden yeterince geri vurmakla aynı şeydir.

Bağlantı özellikleri hakkında daha fazla ayrıntıya sahiptir, ancak genel olarak uygulamayı bırakmayı düşünebilirsiniz.

Müzik uygulamasına özgü bir hizmet başlattığına inanıyorum, bu nedenle görevin kendisi (Müzik uygulaması / kullanıcı arayüzü) kapalı olabilirken, servis arka planda çalışmaya devam eder, böylece müzik yalnızca görev nedeniyle aniden durmaz bellek yönetimi nedenleriyle temizlendi. Gördüklerini etkilemiş olabilir.


1
Teşekkürler, bu bağlantının çok iyi bir tartışması var. Ayrıca haklı olabilirsiniz: Müzik, kötü bir test olmuş olabilir. Sadece tekme için, başka bir uygulamayı deneyeceğim.
eldarerathis

2
Devam edin ve reddit tartışma bana bazı iyi arama terimlerini bulmak yardım etti, ben de belirtildiği Dianne Hackborn bazı mesajların desteklenmeye gibiydi beri bu kabul edecek cevabım . Teşekkürler!
eldarerathis


1
Mükemmel teşekkürler! Benim için bu yazı bana yardımcı oldu: reddit.com/r/Android/comments/mpevh/…
Boris Strandjev

Rocket Player gibi üçüncü taraf müzik çalarlar, servis arka planda çalışıyor olsa bile uygulamayı Son Kullanılanlar listesinden kaydırdığınızda müziği durdurur ve müziği başlatmak için uygulamayı tekrar açmanız veya widget'ta çalmanız gerekir.
Şanslı

78

Google çalışanlarından bazı açıklamalara yol açan sihirli arama terimlerini bulmuş gibiyim. Özellikle, Dianne Hackborn'un son listeden bir şey kaydırdığınızda ne olacağını açıkladığı birkaç farklı yer buldum. İlki , Google+ yayınlarından birine yapılan bir yorumdur :

[W] şapka özellikle yeni bir görevi sildiğinizde gerçekleşir: (1) uygulamanın arka planını veya boş işlemlerini öldürür (bkz. Http://developer.android.com/guide/topics/fundamentals/processes-and- threa.html # Bu ne anlama geliyorsa yaşam döngüsü ) ve (2) yeni http://developer.android.com/reference/android/app/Service.html#onTaskRemoved(android.content.Intent) API'sini anlatmak için kullanır kaldırılmakta olan görevle ilgili uygulamanın hizmetleri, bu yüzden uygun olduğunu düşündüğü her şeyi yapabilir.

Ayrıca bir blog yorumunda şunları da not eder :

Aslında, son görevlerdeki bir girişi kaldırmak, işlem için var olan arka plan işlemlerini öldürür. Doğrudan hizmetlerin durmasına neden olmaz, ancak bunun durdurmaları gerekip gerekmediğine karar vermek için görevin kaldırıldığını bulmalarını sağlayacak bir API vardır. Bu, bir e-posta uygulamasının son görevinin e-posta denetlemeyi durdurmasına neden olmayacağını söylemesidir.

Bir uygulamayı gerçekten tamamen durdurmak istiyorsanız, uygulama bilgilerine gitmek için son görevlere uzun süre basabilir ve orada durma kuvvetini durdurabilirsiniz. Durdurmak için uygulamanın tamamen kesilmesi söz konusudur - tüm işlemler öldürülür, tüm hizmetler durdurulur, tüm bildirimler kaldırılır, tüm alarmlar kaldırılır, vb. Uygulama açıkça talep edilinceye kadar tekrar başlatılamaz.

Bu yüzden, özet, görünüşe göre bir listeyi listeden çıkarmak, önce uygulamanın tüm arka plan işlemlerini öldürecek, ardından onTaskRemoveduygulamayı arka plan görevinin kaldırıldığını bildirmek için kullanacak gibi görünüyor . Bu noktada ne olacağına karar vermek uygulamanın elinde görünüyor, bu yüzden teknik olarak o noktanın ötesinde uygulamaya ne olacağı konusunda teknik olarak zor ve hızlı bir kural olmadığını düşünüyorum.


Bu kesinlikle açık olmayan bir davranış, çok ilginç!
Matthew

msgstr "süreç için varolan herhangi bir arka plan işlemini öldür. Doğrudan hizmetlerin durmasına neden olmaz". Bu hala doğru mu? Dün bir test yaptım. Dün, ana süreçte arkaplan hizmetine sahip bir uygulamayı kaydırdım. Uygulamalar => çalışan UI, 0 işlem ve 0 hizmet gösterdi. Daha sonra ayrı bir uygulamaya özel bir işlemde çalışan bir işlemle aynı uygulamayı elimden aldı. Apps => çalışan UI, 0 işlem ve 1 hizmetim olduğunu söyledi. Bu Android 4.4.4 ile bir Moto X (2014) idi.
Steven Wexler

@StevenWexler: Hizmet birinci durumda kendi başına sona erdi, ikincisinde değil, ya da ikinci senaryoda ana sürecin (bir nedenden dolayı) hizmeti durdurmak istemediği belirlenebilirdi. Kesin olarak bilmek zor.
eldarerathis

Son listeden çıktıktan sonra başlatılan servis otomatik olarak tekrar başlar, onCreate tekrar çağrılır. ama onCreate'daki bazı uygulamalarda onTaskRemoved'den önce ve onTaskRemoved'den sonra denilen bazı uygulamalarda. neden bu davranış o zaman?
Ağustos’ta

21

Kaynak kodunda com.android.internal.policy.impl.RecentApplicationsBackground ve com.android.internal.policy.impl.RecentApplicationsDialog sınıflarındaki bazı bilgiler vardır .

Bunları doğru okuduysam, uygulamaları seçmek için özel işleyiciler var, ancak öğeyi temelde gizleyen ve verilerini temizleyen onDetachedFromWindow()çağrılar dışında bunları kaydırmak için özel bir şey yok com.android.View.onDetachedFromWindow(). Bu, Austin Mills'in cevabına tekabül eden uygulamayı kaydırırken özel bir şey olmadığına işaret eder, çünkü liste aktif uygulamayı göstermediğinden, onPause()bir uygulamayı "bırakma" olduğunda yapılan ve yapılan diğer sistem çağrıları, zaten oldu.


10

Ben geri düğmesi ile aynı yapacağını düşünüyorum. Küçük bir değişiklik hariç. Uygulamadaki finish()tüm aktivite / parçaları olacaktır .

Sadece küçük bir selfbuild uygulamasıyla biraz test yaptım. Siz de test edebilirsiniz. Heres test uygulamam: https://bitbucket.org/Leandros99/lifecycletest (indirmek de mümkündür. İnşa edemeyenler için.)
Her Aktivite yaşam döngüsü yönteminde ( http://developer.android.com/reference/android/app /Activity.html#ActivityLifecycle ), uygulamaya bir günlük yazdırır. Adb logcat ile görüntüleyebilirsiniz (Android SDK, cdd / shell ve tip platform araçlarına cd yükleyin adb logcat. Şimdi göreceksiniz, her seferinde geri tepme veya ana sayfa düğmesi gibi bir şey yaptığınızda, uygulama yukarıda belirtilen yaşam döngüsü yöntemini yazdırır. )

Sorunuz: Son uygulama çekmecesinden bir uygulamayı kaydırırsam, onDestroyyöntem çağrılır. Neredeyse geri düğmesi ile aynı yapar.
Umarım biraz yardım ettim. Sorularınız varsa, sadece sorun.


3

Uygulamayı ve RAM'de depolanan verilerini kapatır. Böylece size daha fazla RAM alanı vererek diğer uygulamaları çalıştırabilirsiniz. Bununla birlikte, arka plan hizmetleri, kullanılan uygulamayı kapatmanın bir sonucu olarak otomatik olarak kapanmaz.


1
Her ne kadar günlük dilde yazılsa da, bu aslında oldukça doğru bir cevap - sürecin elden çıkarıldığı gerçeğini, diğer cevapların birçoğunun (yanlışlıkla geri düğmesiyle karşılaştıran) eksik olduğunu gösteriyor. Ancak, burada eksik olan şey, Android'in yine de bellek elde etmek için gerektiğinde süreçleri elden çıkaracağı, böylece bir bellek temizliği gerçekleştirirken, gerektiğinde / gerektiğinde otomatik olarak gerçekleşecek olduğunun fark edilmesidir.
Chris Stratton
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.