Süreçler arasında iletişim kurmak için bağlayıcı kullanırken, uzak süreç önbelleğe alınmış veya dondurulmuş durumdayken özel dikkat gösterin. Önbelleğe alınmış veya dondurulmuş uygulamalara yapılan aramalar, bu uygulamaların kilitlenmesine veya gereksiz yere kaynak tüketmesine neden olabilir.
Önbelleğe alınmış ve dondurulmuş uygulama durumları
Android, bellek ve CPU gibi sistem kaynaklarını yönetmek için uygulamaları farklı durumlarda tutar.
Önbelleğe alınmış durum
Etkinlikler veya hizmetler gibi kullanıcı tarafından görülebilen bileşenleri olmayan uygulamalar önbelleğe alınmış duruma taşınabilir. Ayrıntılı bilgi için Süreçler ve uygulama yaşam döngüsü başlıklı makaleyi inceleyin. Önbelleğe alınan uygulamalar, kullanıcının tekrar kullanması ihtimaline karşı bellekte tutulur ancak aktif olarak çalışması beklenmez.
Bir uygulama işleminden diğerine bağlama işlemi (ör. bindService kullanma) gerçekleştirildiğinde, sunucu işleminin işlem durumu, istemci işlemi kadar (en az) önemli olacak şekilde yükseltilir (Context#BIND_WAIVE_PRIORITY belirtildiği durumlar hariç). Örneğin, istemci önbelleğe alınmış durumda değilse sunucu da önbelleğe alınmış durumda değildir.
Aksine, bir sunucu işleminin durumu istemcilerinin durumunu belirlemez. Bu nedenle, bir sunucunun istemcilerle bağlayıcı bağlantıları olabilir (en yaygın olarak geri çağırma biçiminde) ve uzak işlem önbelleğe alınmış durumdayken sunucu önbelleğe alınmaz.
Geri çağırmaların yükseltilmiş bir süreçte başladığı ve uygulamalara teslim edildiği API'ler tasarlarken, bir uygulama önbelleğe alınmış duruma girdiğinde geri çağırmaların gönderimini duraklatmayı ve bu durumdan çıktığında devam ettirmeyi göz önünde bulundurun. Bu, önbelleğe alınmış uygulama işlemlerinde gereksiz çalışmayı önler.
Uygulamaların ne zaman önbelleğe alınmış duruma girdiğini veya bu durumdan çıktığını izlemek için ActivityManager.addOnUidImportanceListener kullanın:
// in ActivityManager or Context
activityManager.addOnUidImportanceListener(
new UidImportanceListener() { ... },
IMPORTANCE_CACHED);
Dondurulmuş durum
Sistem, kaynakları korumak için önbelleğe alınmış bir uygulamayı dondurabilir. Dondurulan uygulamalar CPU süresi almaz ve herhangi bir işlem yapamaz. Daha fazla bilgi için Önbelleğe alınmış uygulamaları dondurma başlıklı makaleyi inceleyin.
Bir işlem, dondurulmuş başka bir uzak işleme senkronize (oneway değil) bağlayıcı işlemi gönderdiğinde sistem, uzak işlemi sonlandırır. Bu, arama işlemindeki arama iş parçacığının, uzak işlemin dondurulmasının çözülmesini beklerken süresiz olarak askıda kalmasını önler. Bu durum, arama uygulamasında iş parçacığı açlığına veya kilitlenmelere neden olabilir.
Bir işlem, dondurulmuş bir uygulamaya (genellikle bir geri çağırma bildirerek, bu da genellikle bir oneway yöntemidir) eşzamansız (oneway) bağlayıcı işlemi gönderdiğinde, işlem uzak işlem dondurulana kadar arabelleğe alınır. Arabellek taşarsa alıcı uygulama işlemi kilitlenebilir. Ayrıca, arabelleğe alınmış işlemler, uygulama işlemi dondurulması kaldırılıp bu işlemleri gerçekleştirene kadar eski hale gelebilir.
Uygulamaların eski etkinliklerle aşırı yüklenmesini veya arabelleklerinin dolmasını önlemek için alıcı uygulamanın işlemi dondurulmuşken geri çağırma işlemlerinin gönderilmesini durdurmanız gerekir.
Uygulamaların ne zaman dondurulduğunu veya çözüldüğünü izlemek için
IBinder.addFrozenStateChangeCallback kullanın:
// The binder token of the remote process
IBinder binder = service.getBinder();
// Keep track of frozen state
AtomicBoolean remoteFrozen = new AtomicBoolean(false);
// Update remoteFrozen when the remote process freezes or unfreezes
binder.addFrozenStateChangeCallback(
myExecutor,
new IBinder.FrozenStateChangeCallback() {
@Override
public void onFrozenStateChanged(boolean isFrozen) {
remoteFrozen.set(isFrozen);
}
});
// When dispatching callbacks to the remote process, pause dispatch if frozen:
if (!remoteFrozen.get()) {
// dispatch callback to remote process
}
Use RemoteCallbackList
RemoteCallbackList sınıfı, uzak işlemlerin kaydettiği IInterface geri çağırma listelerini yönetmeye yardımcı olur. Bu sınıf, bağlayıcı ölüm bildirimlerini otomatik olarak işler ve dondurulmuş uygulamalara geri çağırmaları işlemek için seçenekler sunar.
RemoteCallbackList oluştururken dondurulmuş bir aranan politikası belirtebilirsiniz:
FROZEN_CALLEE_POLICY_DROP: Dondurulmuş uygulamalara yapılan geri aramalar sessizce bırakılır. Uygulama önbelleğe alınmışken gerçekleşen etkinlikler (ör. gerçek zamanlı sensör etkinlikleri) uygulama için önemli olmadığında bu politikayı kullanın.FROZEN_CALLEE_POLICY_ENQUEUE_MOST_RECENT: Bir uygulama dondurulmuşken birden fazla geri çağırma yayınlanırsa yalnızca en sonuncusu sıraya alınır ve uygulama dondurulması kaldırıldığında teslim edilir. Bu, yalnızca en son durum güncellemesinin önemli olduğu duruma dayalı geri çağırmalar için kullanışlıdır. Örneğin, uygulamaya mevcut medya sesini bildiren bir geri çağırma.FROZEN_CALLEE_POLICY_ENQUEUE_ALL: Bir uygulama dondurulmuş durumdayken yayınlanan tüm geri çağırmalar sıraya alınır ve uygulama dondurulmuş durumdan çıkarıldığında teslim edilir. Çok fazla geri çağırma işlevi sıraya alınırsa arabellek taşmasına veya eski etkinliklerin birikmesine yol açabileceğinden bu politikayı kullanırken dikkatli olun.
Aşağıdaki örnekte, dondurulmuş uygulamalara geri çağırma işlevlerini bırakan bir RemoteCallbackList örneğinin nasıl oluşturulacağı ve kullanılacağı gösterilmektedir:
RemoteCallbackList<IMyCallbackInterface> callbacks =
new RemoteCallbackList.Builder<IMyCallbackInterface>(
RemoteCallbackList.FROZEN_CALLEE_POLICY_DROP)
.setExecutor(myExecutor)
.build();
// Registering a callback:
callbacks.register(callback);
// Broadcasting to all registered callbacks:
callbacks.broadcast((callback) -> callback.onSomeEvent(eventData));
FROZEN_CALLEE_POLICY_DROP kullanıyorsanız sistem, geri çağırmaya ev sahipliği yapan işlem dondurulmamışsa callback.onSomeEvent() öğesini çağırır.
Sistem hizmetleri ve uygulama etkileşimleri
Sistem hizmetleri genellikle bağlayıcıyı kullanarak birçok farklı uygulamayla etkileşim kurar. Uygulamalar önbelleğe alınmış ve dondurulmuş durumlara girebildiğinden, sistem hizmetlerinin sistem kararlılığını ve performansını korumak için bu etkileşimleri sorunsuz bir şekilde yönetmeye özen göstermesi gerekir.
Sistem hizmetlerinin, uygulama işlemlerinin çeşitli nedenlerle sonlandırıldığı durumları zaten işlemesi gerekir. Bu durumda, onlar adına çalışmayı durdurur ve ölü işlemlere geri aramalar sunmaya devam etmez. Uygulamaların dondurulması, mevcut izleme sorumluluğunun bir uzantısıdır.
Uygulama durumlarını sistem hizmetlerinden izleme
system_server içinde veya yerel arka plan programları olarak çalışan sistem hizmetleri de uygulama işlemlerinin önemini ve dondurulmuş durumunu izlemek için daha önce açıklanan API'leri kullanabilir:
ActivityManager.addOnUidImportanceListener: Sistem hizmetleri, UID önemindeki değişiklikleri izlemek için bir dinleyici kaydedebilir. Bir uygulamadan bağlayıcı çağrısı veya geri arama alındığında hizmet, UID'yi almak ve bunu dinleyici tarafından izlenen önem durumuyla ilişkilendirmek içinBinder.getCallingUid()'yi kullanabilir. Bu, sistem hizmetlerinin arama uygulamasının önbelleğe alınmış durumda olup olmadığını bilmesini sağlar.IBinder.addFrozenStateChangeCallback: Bir sistem hizmeti, bir uygulamadan bağlayıcı nesne aldığında (örneğin, geri çağırma kaydının bir parçası olarak) söz konusuIBinderörneğindeFrozenStateChangeCallbackkaydetmelidir. Bu, bağlayıcıyı barındıran uygulama işlemi dondurulduğunda veya dondurulması kaldırıldığında sistem hizmetini doğrudan bilgilendirir.
Sistem hizmetleri için öneriler
Uygulamalarla etkileşime girebilecek tüm sistem hizmetlerinin, iletişim kurdukları uygulama işlemlerinin önbelleğe alınmış ve dondurulmuş durumunu izlemesini öneririz. Bunu yapmamak şu sorunlara yol açabilir:
- Kaynak tüketimi: Önbelleğe alınmış ve kullanıcı tarafından görünür olmayan uygulamalar için işlem yapmak sistem kaynaklarının boşa harcanmasına neden olabilir.
- Uygulama kilitlenmeleri: Dondurulmuş uygulamalara yapılan senkron bağlayıcı çağrıları, uygulamaların kilitlenmesine neden olur. Dondurulmuş uygulamalara yapılan eşzamansız bağlayıcı çağrıları, eşzamansız işlem arabellekleri taşarsa kilitlenmeye neden olur.
- Beklenmeyen uygulama davranışı: Dondurulması kaldırılan uygulamalar, dondurulmuş durumdayken kendilerine gönderilen arabelleğe alınmış tüm eşzamansız bağlayıcı işlemlerini hemen alır. Uygulamalar dondurulmuş durumda süresiz kalabilir. Bu nedenle, arabelleğe alınmış işlemler çok eski olabilir.
Sistem hizmetleri genellikle uzak geri aramaları yönetmek ve ölü işlemleri otomatik olarak işlemek için RemoteCallbackList kullanır. Dondurulmuş uygulamaları işlemek için Use RemoteCallbackList bölümünde açıklandığı gibi dondurulmuş arayan politikası uygulayarak RemoteCallbackList öğesinin mevcut kullanımını genişletin.