Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Etkinlikler, Android uygulamalarının temel yapı taşlarıdır ve bir dizi farklı durumda bulunabilir. Etkinlik yaşam döngüsü, oluşturulma ile başlar ve yok edilme ile biter ve bu süreçte birçok durum içerir. Bir etkinlik durumu değiştirdiğinde, yaklaşan durum değişikliğinin etkinliğini bilgilendiren ve bu değişikliğe uyum sağlamak için kod yürütmesine izin veren uygun yaşam döngüsü olay yöntemi çağrılır. Bu makalede etkinliklerin yaşam döngüleri incelenir ve bu yaşam döngüsü değişikliklerinin her birinde bir etkinliğin sorumluluğu iyi davranışlı ve güvenilir bir uygulamanın parçası olarak açıklanır.
Etkinlik Yaşam Döngüsüne Genel Bakış
Etkinlikler, Android'e özgü olağan dışı bir programlama kavramıdır. Geleneksel uygulama geliştirmede genellikle uygulamayı başlatmak için yürütülen statik bir ana yöntem vardır. Ancak Android ile işler farklıdır; Android uygulamaları, bir uygulama içindeki herhangi bir kayıtlı etkinlik aracılığıyla başlatılabilir. Uygulamada çoğu uygulama yalnızca uygulama giriş noktası olarak belirtilen belirli bir etkinliğe sahip olur. Ancak, bir uygulama kilitlenirse veya işletim sistemi tarafından sonlandırılırsa, işletim sistemi uygulamayı son açık etkinlikte veya önceki etkinlik yığını içinde başka bir yerde yeniden başlatmayı deneyebilir. Ayrıca, işletim sistemi etkin olmayan etkinlikleri duraklatabilir ve bellek yetersizse geri kazanabilir. Özellikle bu etkinlik önceki etkinliklere ait verilere bağlıysa, bir etkinliğin yeniden başlatılması durumunda uygulamanın durumunu doğru bir şekilde geri yüklemesine izin vermek için dikkatli bir şekilde dikkate alınmalıdır.
Etkinlik yaşam döngüsü, bir etkinliğin yaşam döngüsü boyunca işletim sisteminin çağırdiği bir yöntem koleksiyonu olarak uygulanır. Bu yöntemler, geliştiricilerin uygulamalarının durum ve kaynak yönetimi gereksinimlerini karşılamak için gereken işlevselliği uygulamasına olanak tanır.
Uygulama geliştiricisinin her etkinliğin gereksinimlerini analiz ederek etkinlik yaşam döngüsü tarafından kullanıma sunulan yöntemlerin uygulanması gerektiğini belirlemesi son derece önemlidir. Bunun yapılmaması, uygulama kararlılığına, kilitlenmelere, kaynak şişmesine ve hatta büyük olasılıkla temel işletim sistemi kararlılığına neden olabilir.
Bu bölümde etkinlik yaşam döngüsü ayrıntılı olarak incelenmektedir ve şu unsurları içermektedir:
- Etkinlik Durumları
- Yaşam Döngüsü Yöntemleri
- Uygulamanın Durumunu Koruma
Bu bölüm ayrıca Etkinlik yaşam döngüsü sırasında durumu verimli bir şekilde kaydetme hakkında pratik örnekler sağlayan bir kılavuz içerir. Bu bölümün sonunda Etkinlik yaşam döngüsü ve bir Android uygulamasında nasıl desteklenmeleri gerektiği hakkında bilgi sahibi olmanız gerekir.
Etkinlik Yaşam Döngüsü
Android etkinlik yaşam döngüsü, geliştiriciye bir kaynak yönetimi çerçevesi sağlayan Etkinlik sınıfı içinde kullanıma sunulan bir yöntem koleksiyonundan oluşur. Bu çerçeve, geliştiricilerin uygulama içindeki her etkinliğin benzersiz durum yönetimi gereksinimlerini karşılamasına ve kaynak yönetimini düzgün bir şekilde işlemesine olanak tanır.
Etkinlik Durumları
Android işletim sistemi, Etkinlikleri durumlarına göre rastgele belirler. Bu, Android'in artık kullanılmayan etkinlikleri tanımlamasına yardımcı olur ve işletim sisteminin belleği ve kaynakları geri kazanmasını sağlar. Aşağıdaki diyagramda bir Etkinliğin yaşam süresi boyunca geçirebileceği durumlar gösterilmektedir:
Bu durumlar aşağıdaki gibi 4 ana gruba ayrılabilir:
Etkin veya Çalışıyor – Etkinlikler, etkinlik yığınının üst kısmı olarak da bilinen ön plandaysa etkin veya çalışır olarak kabul edilir. Bu, Android'deki en yüksek öncelikli etkinlik olarak kabul edilir ve bu nedenle, kullanıcı arabiriminin yanıt vermemeye başlamasına neden olabileceğinden, etkinliğin cihazda bulunandan daha fazla bellek kullanmaya çalışması gibi aşırı durumlarda işletim sistemi tarafından öldürülür.
Duraklatıldı – Cihaz uyku moduna geçtiğinde veya bir etkinlik hala görünürken yeni, tam boyutlu olmayan veya saydam bir etkinlik tarafından kısmen gizlendiğinde, etkinlik duraklatılmış olarak kabul edilir. Duraklatılan etkinlikler hala etkindir, yani tüm durum ve üye bilgilerini korur ve pencere yöneticisine bağlı kalır. Bu, Android'deki ikinci en yüksek öncelikli etkinlik olarak kabul edilir ve bu nedenle işletim sistemi tarafından yalnızca bu etkinliği öldürmek Etkin/Çalışan Etkinliği kararlı ve esnek tutmak için gereken kaynak gereksinimlerini karşılayacaksa öldürülür.
Durduruldu/Arka Planlı – Başka bir etkinlik tarafından tamamen gizlenen etkinlikler durdurulmuş veya arka planda kabul edilir. Durdurulan etkinlikler yine de durum ve üye bilgilerini mümkün olduğunca uzun süre saklamaya çalışır, ancak durdurulan etkinlikler üç durumun en düşük önceliği olarak kabul edilir ve bu nedenle işletim sistemi, daha yüksek öncelikli etkinliklerin kaynak gereksinimlerini karşılamak için önce bu durumdaki etkinlikleri öldürür.
Yeniden başlatıldı – Yaşam döngüsünde duraklatılmış olan ve durdurulan bir etkinliğin Android tarafından bellekten kaldırılması mümkündür. Kullanıcı etkinliğe geri giderse yeniden başlatılması, daha önce kaydedilmiş durumuna geri yüklenmesi ve ardından kullanıcıya görüntülenmesi gerekir.
Yapılandırma Değişikliklerine Yanıt Olarak Etkinlik Re-Creation
Durumu daha da karmaşık hale getirmek için, Android Yapılandırma Değişiklikleri adı verilen bir başka engel atar. Yapılandırma değişiklikleri, bir etkinliğin yapılandırması değiştiğinde meydana gelen hızlı etkinlik yok etme ve yeniden oluşturma döngüleridir. Bu değişiklikler, cihazın döndürülmesi (ve etkinliğin yatay veya dikey modda yeniden oluşturulması gerektiğinde), klavyenin görüntülenmesi (ve etkinliğin kendisini yeniden boyutlandırma fırsatı bulduğunda) veya cihazın bir yuva veya docking istasyonuna yerleştirilmesi gibi durumlarda ortaya çıkar.
Yapılandırma değişiklikleri, etkinliğin durdurulması ve yeniden başlatılması sırasında yine aynı Etkinlik Durumu değişikliklerinin oluşmasına neden olur. Ancak, bir uygulamanın hızlı yanıt verme ve yapılandırma değişiklikleri sırasında iyi performans göstermesini sağlamak için, bunların mümkün olan en hızlı şekilde işlenmesi önemlidir. Bu nedenle, Android yapılandırma değişiklikleri sırasında durumu kalıcı hale getirmek için kullanılabilecek belirli bir API'ye sahiptir. Bunu daha sonra Yaşam Döngüsü Boyunca Durumu Yönetme bölümünde ele alacağız.
Etkinlik Yaşam Döngüsü Yöntemleri
Android SDK ve uzantıya göre Xamarin.Android çerçevesi, uygulama içindeki etkinliklerin durumunu yönetmek için güçlü bir model sağlar. Bir etkinliğin durumu değiştiğinde, etkinliğe ilgili etkinlikte belirli yöntemleri çağıran işletim sistemi tarafından bildirim gönderilir. Aşağıdaki diyagramda, Etkinlik Yaşam Döngüsü ile ilgili olarak bu yöntemler gösterilmektedir:
Geliştirici olarak, bir etkinlik içinde bu yöntemleri geçersiz kılarak durum değişikliklerini işleyebilirsiniz. Bununla birlikte, tüm yaşam döngüsü yöntemlerinin kullanıcı arabirimi iş parçacığında çağrıldığını ve işletim sisteminin geçerli etkinliği gizleme, yeni bir etkinlik görüntüleme gibi bir sonraki kullanıcı arabirimi çalışmasını gerçekleştirmesini engelleyeceğini unutmayın. Bu nedenle, bir uygulamanın iyi performans göstermesini sağlamak için bu yöntemlerdeki kod mümkün olduğunca kısa olmalıdır. Uzun süre çalışan görevler arka plan iş parçacığında yürütülmelidir.
Şimdi bu yaşam döngüsü yöntemlerinin her birini ve bunların kullanımını inceleyelim:
OnCreate
OnCreate , bir etkinlik oluşturulduğunda çağrılan ilk yöntemdir.
OnCreate, bir Etkinliğin gerektirebileceği herhangi bir başlangıç işlemini gerçekleştirmek için her zaman geçersiz kılınır.
- Görünüm oluşturma
- Değişkenleri başlatma
- Statik verileri listelere bağlama
OnCreate , etkinlikler arasında durum bilgilerini ve nesneleri depolamak ve geçirmek için kullanılan bir sözlük olan Bundle parametresini alır Paket null değilse, bu, etkinliğin yeniden başlatıldığına ve önceki örnekten durumunu geri yüklemesi gerektiğine işaret eder. Aşağıdaki kod, paketten değerleri alma işlemini gösterir:
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
string intentString;
bool intentBool;
if (bundle != null)
{
intentString = bundle.GetString("myString");
intentBool = bundle.GetBoolean("myBool");
}
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.Main);
}
OnCreate tamamlandığında, Android OnStart çağıracaktır.
OnStart
OnStart , tamamlandıktan sonra OnCreate sistem tarafından her zaman çağrılır. Etkinlikler, etkinlik içindeki görünümlerin geçerli değerlerini yenileme gibi belirli görevleri bir etkinlik görünür hale gelmeden hemen önce gerçekleştirmeleri gerekiyorsa bu yöntemi geçersiz kılabilir. Android, bu yöntemden hemen sonra çağrı OnResume yapacaktır.
OnResume
Etkinlik kullanıcıyla etkileşim kurmaya hazır olduğunda sistem OnResume'ı çağırır. Etkinlikler aşağıdaki gibi görevleri gerçekleştirmek için bu yöntemi geçersiz kılmalıdır:
- Kare hızlarını artırma (oyun geliştirmede ortak bir görev)
- Animasyonları başlatma
- GPS güncelleştirmelerini dinleme
- İlgili uyarıları veya iletişim kutularını görüntüleme
- Dış olay işleyicilerini bağla
Örneğin, aşağıdaki kod parçacığı kameranın nasıl başlatılmış olduğunu gösterir:
protected override void OnResume()
{
base.OnResume(); // Always call the superclass first.
if (_camera==null)
{
// Do camera initializations here
}
}
OnResume içinde yapılan herhangi bir işlemin OnResume içinde geri alınmasının önemli olmasının nedeni, etkinliği yeniden hayata geçirdikten sonra OnPause'ten sonra kesin olarak yürütüleceği garanti edilen tek yaşam döngüsü yöntemi olmasıdır.
OnPause
Sistem etkinliği arka plana koymak üzere olduğunda veya etkinlik kısmen gizlendiğinde OnPause çağrılır. Etkinlikler aşağıdakilere ihtiyaç duyarsa bu yöntemi geçersiz kılmalıdır:
Kaydedilmemiş değişiklikleri kalıcı verilere işleme
Kaynakları tüketen diğer nesneleri yok etme veya temizleme
Kare hızlarını azaltma ve animasyonları duraklatma
Dış olay işleyicilerinin veya bildirim işleyicilerinin (bir hizmete bağlı olanlar) kaydını kaldırın. Etkinlik bellek sızıntılarını önlemek için bu yapılmalıdır.
Benzer şekilde, Etkinlik herhangi bir iletişim kutusu veya uyarı görüntülediyse, bunların
.Dismiss()yöntemi kullanılarak temizlenmesi gerekir.
Örneğin, aşağıdaki kod parçacığı kamerayı serbest bırakır; etkinlik duraklatılırken kamerayı kullanamaz:
protected override void OnPause()
{
base.OnPause(); // Always call the superclass first
// Release the camera as other activities might need it
if (_camera != null)
{
_camera.Release();
_camera = null;
}
}
OnPause'den sonra çağrılabilecek iki olası yaşam döngüsü metodu vardır.
- Aktivite
OnResumeön plana döndürülecekse çağrılacaktır. -
OnStopEtkinlik arka plana yerleştirildiğinde çağrılacaktır.
OnStop
Etkinlik artık kullanıcıya görünmediğinde OnStop çağrılır. Aşağıdakilerden biri oluştuğunda bu durum oluşur:
- Yeni bir etkinlik başlatılıyor ve bu etkinliğin üstünü örtüyor.
- Mevcut bir etkinlik ön plana getiriliyor.
- Etkinlik yok ediliyor.
OnStop Android'in kaynaklar için yetersiz kalması ve Etkinliği düzgün bir şekilde arka planlayamaması gibi düşük bellekli durumlarda her zaman çağrılamayabilir. Bu nedenle, bir Etkinliği yıkım için hazırlarken OnStop çağrılır ifadesinin kullanılmasına güvenmemek en iyisidir. Bundan OnDestroy sonra çağrılabilecek bir sonraki yaşam döngüsü yöntemleri, Etkinlik'in yok olması veya OnRestart Etkinlik'in kullanıcıyla etkileşime geçmek için geri gelmesi olacaktır.
OnDestroy
OnDestroy , yok edilmeden ve bellekten tamamen kaldırılmadan önce etkinlik örneğinde çağrılan son yöntemdir. Aşırı durumlarda Android, Etkinliği barındıran uygulama işlemini sonlandırabilir ve bu da çağrılmamayla sonuçlanır OnDestroy . Çoğu Etkinlik, temizleme ve kapatma işlemlerinin çoğu OnPause ve OnStop yöntemlerinde yapıldığından bu yöntemi uygulamaz.
OnDestroy yöntemi genellikle kaynakları sızdırabilecek uzun süre çalışan görevleri temizlemek için geçersiz kılınır. Bunun bir örneği, OnCreate içinde başlatılan arka plan iş parçacıkları olabilir.
Etkinlik yok edildikten sonra hiçbir yaşam döngüsü yöntemi çağrılmaz.
OnRestart
OnRestart , etkinliğiniz durdurulduktan sonra, yeniden başlatılmadan önce çağrılır. Bunun iyi bir örneği, kullanıcının uygulamadaki bir etkinliğin üzerindeyken giriş düğmesine basması olabilir. Bu olduğunda, OnPause ve OnStop yöntemleri çağrılır ve Aktivite (Etkinlik) arka plana taşınır ama yok edilmez. Kullanıcı daha sonra görev yöneticisini veya benzer bir uygulamayı kullanarak uygulamayı geri yüklediyse, Android etkinliğin OnRestart yöntemini çağırır.
içinde ne tür bir mantığın uygulanması OnRestartgerektiğine ilişkin genel yönergeler yoktur. Bunun nedeniOnStart, Etkinliğin oluşturulup oluşturulmadığına veya yeniden başlatılmasına bakılmaksızın her zaman çağrılır, bu nedenle Etkinliğin gerektirdiği tüm kaynaklar yerine OnRestartiçinde OnStartbaşlatılmalıdır.
OnRestart çağrıldıktan sonra, çağrılacak olan bir sonraki yaşam döngüsü yöntemi OnStart olacaktır.
Geri ve Ana Sayfa
Birçok Android cihazın iki ayrı düğmesi vardır: "Geri" düğmesi ve "Giriş" düğmesi. Bunun bir örneği, Android 4.0.3'ün aşağıdaki ekran görüntüsünde görülebilir:
Bir uygulamayı arka plana yerleştirmenin aynı etkisine sahip gibi görünseler de, iki düğme arasında ince bir fark vardır. Bir kullanıcı Geri düğmesine tıkladığında, Android'e etkinliği tamamladıklarını söyler. Android, Etkinliği yok edecektir. Buna karşılık, kullanıcı Giriş düğmesine tıkladığında etkinlik yalnızca arka plana yerleştirilir – Android etkinliği sonlandırmaz.
Yaşam Döngüsü Boyunca Durumu Yönetme
Bir Etkinlik durdurulduğunda veya yok edildiğinde sistem, Etkinliğin durumunu daha sonra yeniden doldurma için kaydetme fırsatı sağlar. Bu kaydedilen durum örnek durumu olarak adlandırılır. Android, Etkinlik yaşam döngüsü sırasında örnek durumunu depolamak için üç seçenek sunar:
Android'in durumu kaydetmek için kullanacağı
Dictionaryolarak bilinen bir Bundle'da temel değerleri depolama.Bitmapler gibi karmaşık değerleri tutacak özel bir sınıf oluşturma. Android, durumu kaydetmek için bu özel sınıfı kullanır.
Yapılandırma değişikliği yaşam döngüsünü aşma ve etkinlikte durumu koruma sorumluluğunun tamamını üstlenme.
Bu kılavuzda ilk iki seçenek yer alır.
Paket Durumu
Örnek durumunu kaydetmek için birincil seçenek , Paket olarak bilinen bir anahtar/değer sözlüğü nesnesi kullanmaktır.
Bir Etkinlik oluşturulduğunda yöntemin OnCreate parametre olarak bir pakete geçirildiğini unutmayın, bu paket örnek durumunu geri yüklemek için kullanılabilir. Anahtar/değer çiftleri (bit eşlemler gibi) için hızlı veya kolay seri hale getirilmeyecek daha karmaşık veriler için bir paket kullanılması önerilmez; bunun yerine, dizeler gibi basit değerler için kullanılmalıdır.
Etkinlik, Paketteki örnek durumunu kaydetmeye ve almaya yardımcı olacak yöntemler sağlar:
OnSaveInstanceState – Etkinlik yok edilirken Android tarafından çağrılır. Etkinlikler herhangi bir anahtar/değer durumu öğesini kalıcı hale getirmek için bu yöntemi uygulayabilir.
OnRestoreInstanceState – Bu yöntem tamamlandıktan sonra
OnCreateçağrılır ve başlatma tamamlandıktan sonra bir Etkinliğin durumunu geri yüklemesi için başka bir fırsat sağlar.
Aşağıdaki diyagramda bu yöntemlerin nasıl kullanıldığı gösterilmektedir:
OnSaveInstanceState
Etkinlik durdurulurken OnSaveInstanceState çağrılır. Etkinliğin durumunu depolayabileceği bir paket parametresi alır. Bir cihaz yapılandırma değişikliğiyle karşılaştığında, bir Etkinlik, OnSaveInstanceState'yi geçersiz kılan ve Etkinlik durumunu korumak için geçen Bundle nesnesini kullanabilir. Örneğin, aşağıdaki kodu göz önünde bulundurun:
int c;
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
this.SetContentView (Resource.Layout.SimpleStateView);
var output = this.FindViewById<TextView> (Resource.Id.outputText);
if (bundle != null) {
c = bundle.GetInt ("counter", -1);
} else {
c = -1;
}
output.Text = c.ToString ();
var incrementCounter = this.FindViewById<Button> (Resource.Id.incrementCounter);
incrementCounter.Click += (s,e) => {
output.Text = (++c).ToString();
};
}
Yukarıdaki kod, incrementCounter adlı bir düğmeye tıklandığında c adlı bir tamsayıyı artırır ve sonucu output adlı bir TextView'de görüntüler. Bir yapılandırma değişikliği gerçekleştiğinde (örneğin, cihaz döndürüldüğünde) yukarıdaki kod değerini c kaybeder çünkü bundle aşağıdaki şekilde gösterildiği gibi değeri olacaktır null:
Örnekteki c değerini korumak için, Etkinlik OnSaveInstanceState'i geçersiz kılarak değeri aşağıda gösterildiği gibi pakete kaydedebilir.
protected override void OnSaveInstanceState (Bundle outState)
{
outState.PutInt ("counter", c);
base.OnSaveInstanceState (outState);
}
Cihaz yeni bir yönlendirmeye döndürüldüğünde, tamsayı veri paketine kaydedilir ve şu satırla geri alınır:
c = bundle.GetInt ("counter", -1);
Uyarı
Görünüm hiyerarşisinin durumunun da kaydedilebilmesi için her zaman OnSaveInstanceState temel uygulamasını çağırmak önemlidir.
Durumu Görüntüle
Geçersiz kılma OnSaveInstanceState , yukarıdaki örnekteki sayaç gibi yönlendirme değişiklikleri arasında bir Etkinlikte geçici verileri kaydetmek için uygun bir mekanizmadır. Ancak varsayılan uygulaması OnSaveInstanceState , her görünümün atanmış bir kimliği olduğu sürece her görünüm için geçici verileri kullanıcı arabirimine kaydetmeyi üstlenir. Örneğin, bir uygulamanın XML'de aşağıdaki gibi tanımlanmış bir EditText öğesi olduğunu varsayalım:
<EditText android:id="@+id/myText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
EditText Denetim id atanmış olduğundan, kullanıcı bazı veriler girip cihazı döndürüyorsa, veriler aşağıda gösterildiği gibi görüntülenmeye devam eder:
OnRestoreInstanceState
OnRestoreInstanceState fonksiyonu, sonrasında OnStart çağrılır. Bir etkinliğe, daha önce önceki OnSaveInstanceStatesırasında bir Pakete kaydedilmiş olan tüm durumları geri yükleme fırsatı sağlar. Ancak bu, için OnCreatesağlanan paketle aynıdır.
Aşağıdaki kod, içinde OnRestoreInstanceStatedurumun nasıl geri yüklenebileceğini gösterir:
protected override void OnRestoreInstanceState(Bundle savedState)
{
base.OnRestoreInstanceState(savedState);
var myString = savedState.GetString("myString");
var myBool = savedState.GetBoolean("myBool");
}
Bu yöntem, durumun ne zaman geri yükleneceği konusunda biraz esneklik sağlamak için mevcuttur. Bazen örnek durumunu geri yüklemeden önce tüm başlatmalar yapılana kadar beklemek daha uygundur. Ayrıca, mevcut bir Etkinliğin alt sınıfı yalnızca örnek durumundan belirli değerleri geri yüklemek isteyebilir. Çoğu etkinlik için sağlanan OnCreatepaketi kullanarak durumu geri yükleyebildiğinden çoğu durumda geçersiz kılmak OnRestoreInstanceStategerekli değildir.
Bir Bundle kullanarak durum kaydetme örneği için Kılavuz - Etkinlik durumunu kaydetme kılavuzuna bakın.
Paket Sınırlamaları
Geçici verileri kaydetmeyi kolaylaştırsa OnSaveInstanceState da bazı sınırlamaları vardır:
Her durumda çağrılmaz. Örneğin, bir etkinlikten çıkmak için Giriş veya Geri tuşlarına basıldığında
OnSaveInstanceStateçağrılmaz.içine
OnSaveInstanceStategeçirilen paket, görüntüler gibi büyük nesneler için tasarlanmamıştır. Büyük nesneler söz konusu olduğunda, nesnenin OnRetainNonConfigurationInstance'tan kaydedilmesi, aşağıda açıklandığı gibi, tercih edilir.Paket kullanılarak kaydedilen veriler serileştirilir ve bu da gecikmelere neden olabilir.
Paket durumu, çok fazla bellek kullanmayan basit veriler için kullanışlıdır, yapılandırma dışı örnek verileri ise daha karmaşık veriler veya web hizmeti çağrısı veya karmaşık bir veritabanı sorgusu gibi alınması pahalı veriler için kullanışlıdır. Yapılandırma dışı örnek verileri gerektiğinde bir nesneye kaydedilir. Sonraki bölümde, OnRetainNonConfigurationInstance yapılandırma değişiklikleri aracılığıyla daha karmaşık veri türlerini korumanın bir yolu olarak tanıtır.
Karmaşık Verileri Kalıcı Hale Getirme
Android, paketteki verileri kalıcı hale getirmek için OnRetainNonConfigurationInstance'ı geçersiz kılarak ve kalıcı olacak verileri içeren bir Java.Lang.Object örneğini döndürerek verilerin kaydedilmesini de destekler. Durumu kaydetmek için kullanmanın OnRetainNonConfigurationInstance başlıca iki avantajı vardır:
'den
OnRetainNonConfigurationInstancedöndürülen nesne, bellek bu nesneyi koruduğundan daha büyük, daha karmaşık veri türleriyle iyi performans gösterir.OnRetainNonConfigurationInstanceyöntemi isteğe bağlı olarak ve yalnızca gerektiğinde çağrılır. Bu, el ile önbellek kullanmaktan daha ekonomiktir.
OnRetainNonConfigurationInstance kullanımı, verileri birden çok kez getirmenin pahalı olduğu senaryolar için, örneğin web hizmeti çağrılarında, uygundur. Örneğin, Twitter'da arama yapılan aşağıdaki kodu göz önünde bulundurun:
public class NonConfigInstanceActivity : ListActivity
{
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
SearchTwitter ("xamarin");
}
public void SearchTwitter (string text)
{
string searchUrl = String.Format("http://search.twitter.com/search.json?" + "q={0}&rpp=10&include_entities=false&" + "result_type=mixed", text);
var httpReq = (HttpWebRequest)HttpWebRequest.Create (new Uri (searchUrl));
httpReq.BeginGetResponse (new AsyncCallback (ResponseCallback), httpReq);
}
void ResponseCallback (IAsyncResult ar)
{
var httpReq = (HttpWebRequest)ar.AsyncState;
using (var httpRes = (HttpWebResponse)httpReq.EndGetResponse (ar)) {
ParseResults (httpRes);
}
}
void ParseResults (HttpWebResponse httpRes)
{
var s = httpRes.GetResponseStream ();
var j = (JsonObject)JsonObject.Load (s);
var results = (from result in (JsonArray)j ["results"] let jResult = result as JsonObject select jResult ["text"].ToString ()).ToArray ();
RunOnUiThread (() => {
PopulateTweetList (results);
});
}
void PopulateTweetList (string[] results)
{
ListAdapter = new ArrayAdapter<string> (this, Resource.Layout.ItemView, results);
}
}
Bu kod web'den JSON olarak biçimlendirilmiş sonuçları alır, ayrıştırır ve aşağıdaki ekran görüntüsünde gösterildiği gibi sonuçları bir listede gösterir:
Bir yapılandırma değişikliği gerçekleştiğinde (örneğin, bir cihaz döndürüldüğünde) kod işlemi yineler. Aşağıda gösterildiği gibi, başlangıçta alınan sonuçları yeniden kullanmak ve gereksiz, tekrarlayan ağ çağrılarını önlemek için, sonuçları OnRetainNonconfigurationInstance içinde kaydedebiliriz.
public class NonConfigInstanceActivity : ListActivity
{
TweetListWrapper _savedInstance;
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
var tweetsWrapper = LastNonConfigurationInstance as TweetListWrapper;
if (tweetsWrapper != null) {
PopulateTweetList (tweetsWrapper.Tweets);
} else {
SearchTwitter ("xamarin");
}
public override Java.Lang.Object OnRetainNonConfigurationInstance ()
{
base.OnRetainNonConfigurationInstance ();
return _savedInstance;
}
...
void PopulateTweetList (string[] results)
{
ListAdapter = new ArrayAdapter<string> (this, Resource.Layout.ItemView, results);
_savedInstance = new TweetListWrapper{Tweets=results};
}
}
Cihaz döndürüldüğünde artık özgün sonuçlar LastNonConfiguartionInstance özelliğinden alınır. Bu örnekte sonuçlar, tweet'leri içeren bir string[]'den oluşur.
OnRetainNonConfigurationInstance döndürülmelerini gerektirdiğindenJava.Lang.Object, string[] aşağıda gösterildiği gibi , alt sınıflarına Java.Lang.Objectsahip bir sınıfta sarmalanır:
class TweetListWrapper : Java.Lang.Object
{
public string[] Tweets { get; set; }
}
Örneğin, aşağıdaki kodda gösterildiği gibi, OnRetainNonConfigurationInstance öğesinden döndürülen nesne olarak bir TextView kullanmaya çalışmak, Activity'nin sızmasına neden olacaktır.
TextView _textView;
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
var tv = LastNonConfigurationInstance as TextViewWrapper;
if(tv != null) {
_textView = tv;
var parent = _textView.Parent as FrameLayout;
parent.RemoveView(_textView);
} else {
_textView = new TextView (this);
_textView.Text = "This will leak.";
}
SetContentView (_textView);
}
public override Java.Lang.Object OnRetainNonConfigurationInstance ()
{
base.OnRetainNonConfigurationInstance ();
return _textView;
}
Bu bölümde, Bundle ile basit durum verilerini nasıl koruyabileceğimizi ve OnRetainNonConfigurationInstance ile daha karmaşık veri türlerini nasıl kalıcı hale getirebileceğimizi öğrendik.
Özet
Android etkinlik yaşam döngüsü, bir uygulama içindeki etkinliklerin durum yönetimi için güçlü bir çerçeve sağlar, ancak anlamak ve uygulamak zor olabilir. Bu bölümde, bir etkinliğin yaşam süresi boyunca geçirebileceği farklı durumlar ve bu durumlarla ilişkili yaşam döngüsü yöntemleri tanıtıldı. Ardından, bu yöntemlerin her birinde ne tür bir mantığın gerçekleştirilmesi gerektiği konusunda rehberlik sağlanmıştır.