Etkinlik Yaşam Döngüsü
Etkinlikler, Android uygulamalarının temel bir yapı taşıdır ve çeşitli durumlarda bulunabilir. Etkinlik yaşam döngüsü, örnek oluşturma ile başlar ve yok etme ile biter ve arasında birçok durum içerir. Bir etkinliğin durumu değiştiğinde, uygun yaşam döngüsü olay yöntemi çağrılır, bu durum değişikliği etkinliğine bildirimde bulunur ve bu değişikliğe uyum sağlamak için kodu yürütmesine izin verir. Bu makale, etkinliklerin yaşam döngüsünü inceler ve bu durum değişikliklerinin her biri sırasında, iyi davranmış, güvenilir bir uygulamanın bir parçası olmak için bir etkinliğin sahip olduğu sorumluluğu açıklar.
Etkinlik yaşam döngüsüne genel bakış
Etkinlikler, Android 'e özgü bir olağandışı programlama kavramıdır. Geleneksel uygulama geliştirmede genellikle uygulamayı başlatmak için yürütülen bir statik Main yöntemi vardır. Ancak Android ile, bazıları 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ında başka herhangi bir yerde yeniden başlatmaya çalışabilir. Ayrıca, işletim sistemi etkin olmayan etkinlikleri duraklatabilir ve bellek azalırsa bunları geri alabilir. Uygulamanın, özellikle bu etkinlik önceki etkinliklerdeki verilere bağımlıysa, bir etkinliğin yeniden başlatılması durumunda durumunu düzgün bir şekilde geri yüklemelerine izin vermek için dikkatli bir dikkat edilmelidir.
Etkinlik yaşam döngüsü, bir etkinliğin yaşam döngüsü boyunca işletim sisteminin çağırdığı yöntemlerin bir koleksiyonu olarak uygulanır. Bu yöntemler, geliştiricilerin uygulamalarının durum ve kaynak yönetimi gereksinimlerini karşılamak için gerekli olan işlevleri uygulamasına olanak tanır.
Uygulama geliştiricisinin, etkinlik yaşam döngüsü tarafından sunulan hangi yöntemlerin uygulanması gerektiğini tespit etmek için her bir etkinliğin gereksinimlerini analiz edebilmesi son derece önemlidir. Bunun yapılmaması, uygulamanın kararsız hale gelmesine, kilitlenmelere, kaynak blobuna ve hatta büyük olasılıkla işletim sistemi kararsızlığına neden olabilir.
Bu bölümde aşağıdakiler de dahil olmak üzere etkinlik yaşam döngüsü ayrıntılı olarak incelenemiyor:
- Etkinlik durumları
- Yaşam döngüsü yöntemleri
- Uygulamanın durumunu koruma
Bu bölüm, etkinlik yaşam döngüsü sırasında durumu verimli bir şekilde kaydetme konusunda pratik örnekler sağlayan bir anlatım de içerir. Bu bölümün sonuna kadar, etkinlik yaşam döngüsünü ve bunu bir Android uygulamasında desteklemeyi bilmeniz gerekir.
Etkinlik Yaşam Döngüsü
Android etkinlik yaşam döngüsü, bir kaynak yönetim çerçevesi ile geliştiriciyi sağlayan etkinlik sınıfı içinde kullanıma sunulan yöntemlerin bir koleksiyonunu içerir. Bu çerçeve, geliştiricilerin bir uygulamadaki her bir etkinliğin benzersiz durum yönetimi gereksinimlerini karşılamasını ve kaynak yönetimini doğru şekilde işlemesini sağlar.
Etkinlik durumları
Android işletim sistemi, etkinlikleri durumlarına göre alır. Bu, Android 'in artık kullanılmayan etkinlikleri belirlemesine yardımcı olur ve işletim sisteminin belleği ve kaynakları geri almalarına izin verir. Aşağıdaki diyagramda bir etkinliğin ömrü boyunca gidebileceği durumlar gösterilmektedir:
Bu durumlar, 4 ana grubuna aşağıdaki gibi ayrılabilir:
Etkin veya çalışan – etkinlikler, etkinlik yığınının en üst adı olarak da bilinen, etkin veya çalışır durumda olduğu kabul edilir. Bu, Android 'de en yüksek öncelikli etkinlik olarak kabul edilir ve bu nedenle, etkinlik, cihazın yanıt vermemeye başlamasına neden olabileceği gibi yalnızca olağanüstü durumlarda işletim sistemi tarafından sonlandıralınacaktır.
Duraklatıldı – cihaz uyku moduna geçtiğinde veya bir etkinlik hala görünür ancak yeni, tam boyutlu veya şeffaf bir etkinlik tarafından kısmen gizleniyorsa, etkinlik duraklatıldı olarak kabul edilir. Duraklatılmış etkinlikler hala etkin, diğer bir deyişle, tüm durum ve üye bilgilerini korur ve pencere yöneticisi 'ne bağlı kalır. Bu, Android 'deki ikinci en yüksek öncelikli etkinlik olarak değerlendirilir ve bu etkinlik, bu etkinliği sonlandırmanız durumunda yalnızca işletim sistemi tarafından sonlandırılarak etkin/çalışan etkinliğin kararlı ve yanıt vermesini sağlamak için gereken kaynak gereksinimlerini karşılar.
Durdurulan/Backgrounded – başka bir etkinlik tarafından tamamen gizlenme etkinlikleri durdurulmuş veya arka planda sayılır. Durdurulan etkinlikler hala durum ve üye bilgilerini mümkün olduğunca uzun süre tutmaya çalışır, ancak durdurulan etkinlikler üç durumun en düşük önceliği olarak değerlendirilir ve bu nedenle, işletim sistemi, daha yüksek öncelikli etkinliklerin kaynak gereksinimlerini karşılamak üzere bu durumdaki etkinlikleri sonlandırır.
Yeniden başlatıldı – bir etkinliğin, yaşam döngüsünün Android tarafından bellekten kaldırılması için her yerde duraklatılmış olması mümkündür. Kullanıcı etkinliğe geri gezinirse yeniden başlatılması ve daha önce kaydedilen durumuna geri yüklenmesi ve sonra kullanıcıya gösterilmesi gerekir.
Yapılandırma değişikliklerine yanıt olarak etkinlik Re-Creation
Önemli bir şekilde daha karmaşık hale getirmek için, Android yapılandırma değişiklikleri adlı karışımda daha fazla bir anahtar oluşturur. Yapılandırma değişiklikleri, bir etkinliğin yapılandırması değiştiğinde gerçekleşen hızlı etkinlik yok etme/yeniden oluşturma döngülerine (örneğin, cihaz döndürüldüğünde (ve etkinliğin kendi yatay veya dikey modda yeniden oluşturulması gerekir), klavye görüntülendiğinde (ve etkinlik kendisini yeniden boyutlandırmayla birlikte sunulur) veya cihaz bir dock 'a yerleştirildiğinde diğerleri arasında.
Yapılandırma değişiklikleri, bir etkinliği durdurma ve yeniden başlatma sırasında ortaya çıkabilecek aynı etkinlik durumu değişikliklerine neden olmaya devam eder. Ancak, bir uygulamanın yanıt vermesini ve yapılandırma değişiklikleri sırasında iyi gerçekleştirdiğinden emin olmak için, mümkün olduğunca hızlı bir şekilde işlenmeleri önemlidir. Bu nedenle, Android 'in yapılandırma değişiklikleri sırasında durumu kalıcı hale getirmek için kullanılabilecek belirli bir API 'SI vardır. Bu, daha sonra yaşam döngüsü boyunca yönetim durumu bölümünde ele alınacaktır.
Etkinlik yaşam döngüsü yöntemleri
Android SDK ve, uzantısı ile, Xamarin. Android çerçevesi, bir uygulamadaki etkinliklerin durumunu yönetmek için güçlü bir model sağlar. Etkinliğin durumu değiştirilirken, etkinlik o etkinlik üzerinde belirli yöntemleri çağıran işletim sistemi tarafından bilgilendirilir. Aşağıdaki diyagramda, etkinlik yaşam döngüsüne göre bu yöntemler gösterilmektedir:
Bir 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ığından ve işletim sisteminin, geçerli etkinliği gizleme, yeni bir etkinliği görüntüleme gibi sonraki Kullanıcı arabirimini gerçekleştirmesini engelleyecek şekilde aklınızda olduğunu unutmayın. Bu şekilde, bir uygulamanın iyi bir şekilde gerçekleştirilmesini sağlamak için bu yöntemlerin kodu mümkün olduğunca kısa olmalıdır. Uzun süre çalışan görevlerin bir arka plan iş parçacığında yürütülmesi gerekir.
Bu yaşam döngüsü yöntemlerinin her birini ve kullanımlarını inceleyelim:
OnCreate
OnCreate , bir etkinlik oluşturulduğunda çağrılacak ilk yöntemdir.
OnCreate , şöyle bir etkinlik için gerekebilecek başlatma başlatmaları gerçekleştirmek için her zaman geçersiz kılınır:
- Görünümler oluşturma
- Değişkenleri başlatma
- Statik verileri listelere bağlama
OnCreate paket null değilse, etkinliğin yeniden başlatıldığı ve durumunu önceki örnekten geri yüklemesi gereken durum bilgilerini ve Etkinlikler arasında nesneleri depolamak ve geçirmek için bir sözlük olan bir OnCreate parametresi alır. Aşağıdaki kod, paketteki değerlerin nasıl alınacağını 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);
}
İşlem tamamlandıktan sonra OnCreate Android çağırır OnStart .
Başlangıçta
OnStart , tamamlandığında sistem tarafından her zaman çağrılır . Etkinlik içindeki geçerli görünümlerin değerlerini yenilemek gibi, etkinlik görünür hale gelmeden önce belirli bir görevi gerçekleştirmeleri gerekiyorsa, etkinlikler bu yöntemi geçersiz kılabilir. Android OnResume Bu yöntemden hemen sonra çağracaktır.
Onözgeçmişi
Sistem, etkinlik kullanıcıyla etkileşimde bulunmaya başlamaya hazırsanız Onözgeçmişi çağırır. Etkinlikler aşağıdaki gibi görevleri gerçekleştirmek için bu yöntemi geçersiz kılmalıdır:
- Çerçeve hızlarını artırma (oyun geliştirmede ortak bir görev)
- Animasyonlar başlatılıyor
- GPS güncelleştirmelerini dinleme
- İlgili tüm uyarıları veya iletişimleri görüntüleme
- Dış olay işleyicilerini bağlayın
Örnek olarak, aşağıdaki kod parçacığı kameranın nasıl başlatılacağını göstermektedir:
protected override void OnResume()
{
base.OnResume(); // Always call the superclass first.
if (_camera==null)
{
// Do camera initializations here
}
}
OnResume , ' de yapılan herhangi bir işlem OnPauseOnResume , etkinlik geri alındıktan sonra yürütülmesi garanti edilen tek yaşam döngüsü yöntemi olduğundan, ' de yapılan herhangi bir işlemin tamamlanması gerektiğinden önemlidir OnPause .
OnPause
Sistem etkinliği arka plana koymak üzereyken veya etkinlik kısmen görünmez hale geldiğinde OnPause çağrılır. Şunlar gerekirse, etkinlikler bu yöntemi geçersiz kılmalıdır:
Kaydedilmemiş değişiklikleri kalıcı verilere Kaydet
Kaynakları kullanan diğer nesneleri yok etme veya temizleme
Kare hızlarını aşağı doğru artırma ve animasyonları duraklatma
Dış olay işleyicilerinin veya bildirim işleyicilerinin kaydını kaldırın (yani, bir hizmete bağlı olanlar). Bu işlem, etkinlik belleği sızıntılarını engellemek için yapılmalıdır.
Benzer şekilde, etkinlik herhangi bir iletişim kutusu veya uyarı görüntüleniyorsa, yöntemiyle temizlenmelidir
.Dismiss().
Örnek olarak, etkinlik duraklatıldıktan sonra bunu kullanmadığı için aşağıdaki kod parçacığı kamerayı serbest getirir:
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;
}
}
Sonrasında çağrılacak olabilecek iki yaşam döngüsü yöntemi vardır OnPause :
OnResumeEtkinlik, ön plana döndürülmek için çağrılacaktır.OnStopEtkinlik arka plana yerleştiriliyorsa çağrılacaktır.
OnStop
Etkinlik artık kullanıcıya görünür olmadığında OnStop çağrılır. Bu, aşağıdakilerden biri gerçekleştiğinde meydana gelir:
- Yeni bir etkinlik başlatılıyor ve bu etkinliği kapsamakta.
- Mevcut bir etkinlik, ön plana getirildi.
- Etkinlik yok ediliyor.
OnStop , Android 'in kaynaklar için ne zaman arka planda düzgün bir şekilde arkalanmadığı gibi düşük bellek durumlarında her zaman çağrılamayabilir. Bu nedenle, OnStop bir etkinlik yok etme için hazırlanırken çağrılan alma işlemi en iyisidir. Bundan sonra çağrılabilecek bir sonraki yaşam döngüsü yöntemi, OnDestroy etkinlik uzaklaşıyorsa veya OnRestart etkinlik kullanıcıyla etkileşime geçmek üzere geri geliyorsa olur.
OnDestroy
OnDestroy , bir etkinlik örneğinde yok etme ve bellekten tamamen kaldırılmadan önce çağrılan son yöntemdir. Olağanüstü durumlarda Android, etkinliği barındıran uygulama işlemini sonlandırabilir ve bu da OnDestroy çağrılmamalıdır. Çoğu etkinlik, ve yöntemlerinde çoğu temizleme ve kapatma yapıldığından bu yöntemi uygulamaz OnPauseOnStop . OnDestroyYöntemi genellikle kaynakları sızabilen uzun süre çalışan görevleri temizlemek için geçersiz kılınır. Buna bir örnek, içinde başlatılan arka plan iş parçacıklarından kaynaklanabilir OnCreate .
Etkinlik yok edildikten sonra çağrılan bir yaşam döngüsü yöntemi olmayacak.
OnRestart
Onrestart , etkinliğiniz durdurulduktan sonra, yeniden başlatmadan önce çağrılır. Bunun iyi bir örneği, kullanıcının uygulamadaki bir etkinlikte giriş düğmesine bastığı bir örnektir. Bu durumda OnPauseOnStop Yöntemler çağrılır ve etkinlik arka plana taşınır ancak yok edilmez. Kullanıcı daha sonra Görev Yöneticisi veya benzer bir uygulama kullanarak uygulamayı geri yüklüyorsanız, Android OnRestart etkinliğin yöntemini çağırır.
Ne tür mantığın uygulanması gerektiği konusunda genel bir yönerge yoktur OnRestart . Bunun nedeni, OnStart etkinliğin oluşturulma veya yeniden başlatılıp başlatılmayacağını bağımsız olarak her zaman çağrılır, böylece etkinlik için gereken tüm kaynaklar OnStart yerine ' de başlatılmalıdır OnRestart .
Sonrasında çağrılan sonraki yaşam döngüsü yöntemi OnRestart olur OnStart .
Geri ve giriş
Birçok Android cihazda iki farklı düğme vardır: bir "geri" düğmesi ve bir "giriş" düğmesi. Android 4.0.3 'in aşağıdaki ekran görüntüsünde buna bir örnek görünebilir:
Bir uygulamayı arka planda yerleştirmekle aynı etkiye sahip olsa bile, iki düğme arasında hafif bir farklılık vardır. Bir Kullanıcı geri düğmesine tıkladığında, Android tarafından etkinlikte gerçekleştirdikleri hakkında söyleirler. Android etkinliği yok eder. 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ü genelinde durumu yönetme
Bir etkinlik durdurulduğunda veya yok edildiğinde, sistem daha sonra yeniden doldurma için etkinliğin durumunu 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:
Temel değerleri,
DictionaryAndroid 'in durumu kaydetmek için kullanacağı birDictionaryolarak bilinen bir şekilde depolama.Bit eşlemler gibi karmaşık değerleri tutacak özel bir sınıf oluşturma. Android, durumu kaydetmek için bu özel sınıfı kullanacaktır.
Yapılandırma değişikliği yaşam döngüsünü atlama ve etkinlikteki durumu korumak için tüm sorumluluğu kabul etme.
Bu kılavuzda ilk iki seçenek ele alınmaktadır.
Paket durumu
Örnek durumunu kaydetmek için birincil seçenek, paketolarak bilinen bir anahtar/değer sözlük nesnesi kullanmaktır.
OnCreateYöntemin bir paketi parametre olarak geçirdiğini bir etkinlik oluşturulduğunda, bu paket örnek durumunu geri yüklemek için kullanılabilir. Anahtar/değer çiftlerine (bit eşlemler gibi) hızla veya kolayca serileştirmeyen daha karmaşık veriler için bir paket kullanılması önerilmez; Bunun yerine, dizeler gibi basit değerler için kullanılmalıdır.
Bir etkinlik, paketteki örnek durumunu kaydetmeye ve almaya yardımcı olmak için yöntemler sağlar:
Onsaveınstancestate – bu, etkinlik yok edildiğinde Android tarafından çağırılır. Tüm anahtar/değer durumu öğelerini kalıcı hale getirmek için bu yöntem, etkinlikleri uygulayabilir.
Onrestoreınstancestate – bu Yöntem, yöntemin tamamlanmasının ardından çağrılır ve bir etkinliğin başlatma tamamlandıktan sonra 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:
Onsaveınstancestate
Etkinlik durdurulmakta olduğundan Onsaveınstancestate çağrılır. Etkinliğin durumunu depolayabileceği bir paket parametresi alır. Bir cihaz bir yapılandırma değişikliği yaşadığında, etkinlik Bundle durumu geçersiz kılarak etkinlik durumunu korumak için geçirilen nesneyi kullanabilir OnSaveInstanceState . Ö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, adlı c bir düğme tıklandığı zaman adlı bir tamsayıyı artırır incrementCounter ve sonucu adlandırılmış bir ile görüntüler TextViewoutput . Bir yapılandırma değişikliği gerçekleştiğinde, örneğin, cihaz döndürüldüğünde Yukarıdaki kod, cbundlenull aşağıdaki şekilde gösterildiği gibi, olduğu için değerini kaybeder:
Bu örnekteki değerini korumak için c etkinlik geçersiz kılabilir ve OnSaveInstanceState değeri aşağıda gösterildiği gibi pakete kaydedebilir:
protected override void OnSaveInstanceState (Bundle outState)
{
outState.PutInt ("counter", c);
base.OnSaveInstanceState (outState);
}
Artık cihaz yeni bir yöne döndürüldüğünde, tam sayı pakete kaydedilir ve satırla alınır:
c = bundle.GetInt ("counter", -1);
Not
Görünüm hiyerarşisinin durumunun de kaydedilebilmesi için, her zaman temel uygulamasını çağırmak önemlidir OnSaveInstanceState .
Durumu görüntüle
Geçersiz kılma, OnSaveInstanceState Yukarıdaki örnekteki sayaç gibi, bir etkinlikte geçici verileri yönlendirme değişiklikleri arasında kaydetmek için uygun bir mekanizmadır. Bununla birlikte, varsayılan uygulamasının her görünüm OnSaveInstanceState için Kullanıcı arabiriminde geçici verileri kaydetmesi ve her bir görünümün BIR kimliği atanmış olması gerekir. Örneğin, bir uygulamanın EditText XML 'de tanımlanan bir öğesi aşağıdaki gibi olduğunu varsayalım:
<EditText android:id="@+id/myText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
EditTextDenetim id atanmış olduğundan, Kullanıcı bazı verileri girdiğinde ve cihazı döndürdüğünde, aşağıda gösterildiği gibi veriler hala görüntülenir:
Onrestoreınstancestate
Onrestoreınstancestate , öğesinden sonra çağrılır . Daha önce önceki bir pakete kaydedilen tüm durumları geri yükleme fırsatına bir etkinlik sağlar OnSaveInstanceState . Bununla birlikte, için sunulan aynı paket budur OnCreate .
Aşağıdaki kod, durumunun nasıl geri yüklenebileceğinizi göstermektedir OnRestoreInstanceState :
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üklenmesi gerektiği konusunda bir esneklik sağlamak için vardır. Bazen örnek durumunu geri yüklemeden önce tüm başlatmalar tamamlanana kadar beklemek daha uygundur. Ayrıca, var olan bir etkinliğin bir alt sınıfı yalnızca belirli değerleri örnek durumundan geri yüklemek isteyebilir. Çoğu durumda, çok sayıda OnRestoreInstanceState etkinliğin ' de belirtilen demeti kullanarak durumu geri yüklemesi mümkün olduğundan, bunun geçersiz kılınması gerekli değildir OnCreate .
Kullanılarak durum kaydetme örneği için Bundle , Bundlekonusuna bakın.
Paket sınırlamaları
OnSaveInstanceState, Geçici verileri kaydetmeyi kolaylaştırır, ancak bazı sınırlamalar vardır:
Her durumda çağrılmaz. Örneğin, bir etkinlikten çıkmak için Home veya Back tuşlarına basıldığında çağrılmaya neden olmaz.
Öğesine geçirilen paket,
OnSaveInstanceStategörüntüler gibi büyük nesneler için tasarlanmamıştır. Büyük nesneler söz konusu olduğunda, OnRetainNonConfigurationInstance ' den nesnenin kaydedilmesi aşağıda anlatıldığı gibi tercih edilir.Paket kullanılarak kaydedilen veriler serileştirilir ve bu da gecikmelere yol açabilir.
Paket durumu, çok fazla bellek kullanmayan basit veriler için yararlıdır, ancak yapılandırma olmayan örnek verileri daha karmaşık veriler veya alınması pahalı olan veriler (örneğin, bir Web hizmeti çağrısıyla veya karmaşık bir veritabanı sorgusu) için faydalıdır. Yapılandırma olmayan ö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 koruma yöntemi sunulmaktadır.
Karmaşık verileri kalıcı hale getirme
Paketteki kalıcı verilerin yanı sıra, Android, OnRetainNonConfigurationInstance geçersiz kılarak ve kalıcı hale getirmek için verileri içeren bir örneğini döndürerek verilerin kaydedilmesini da destekler. Durumu kaydetmek için kullanmanın iki birincil avantajı vardır OnRetainNonConfigurationInstance :
OnRetainNonConfigurationInstanceBellek bu nesneyi koruduğundan, öğesinden döndürülen nesne daha büyük, daha karmaşık veri türleriyle iyi çalışır.OnRetainNonConfigurationInstanceYöntemi istek üzerine ve yalnızca gerektiğinde çağrılır. Bu, el ile önbellek kullanmaktan daha ekonomiktir.
Kullanımı OnRetainNonConfigurationInstance , Web hizmeti çağrılarında olduğu gibi verileri birden çok kez almak için pahalı olduğu senaryolar için uygundur. Örneğin, Twitter 'da arama yapan 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, JSON olarak biçimlendirilen Web 'den sonuçları alır, bunları ayrıştırır ve ardından sonuçları aşağıdaki ekran görüntüsünde gösterildiği gibi 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. İlk alınan sonuçları yeniden kullanmak ve gereksiz ve gereksiz ağ çağrılarına neden olmaması için, OnRetainNonconfigurationInstance aşağıda gösterildiği gibi sonuçları kaydetmek için kullanabiliriz:
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};
}
}
Artık cihaz döndürüldüğünde, özgün sonuçlar LastNonConfiguartionInstance özelliğinden alınır. Bu örnekte, sonuçlar, kapsayan çok sayıda yer işaretlerinden oluşur string[] . , OnRetainNonConfigurationInstance Bir Java.Lang.Object döndürüldüğünden, string[]Java.Lang.Object aşağıda gösterildiği gibi alt sınıflara sahip bir sınıfa sarmalanmış olduğundan.
class TweetListWrapper : Java.Lang.Object
{
public string[] Tweets { get; set; }
}
Örneğin, ' TextView den döndürülen bir nesne olarak kullanmaya çalışılması OnRetainNonConfigurationInstance , aşağıdaki kod tarafından gösterildiği gibi etkinliği sızıntısına neden olur:
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, ile basit durum verilerini nasıl koruyabileceğiniz Bundle ve ile daha karmaşık veri türleri nasıl kalıcı hale getiriyoruz OnRetainNonConfigurationInstance .
Özet
Android etkinlik yaşam döngüsü, bir uygulamadaki etkinliklerin durum yönetimi için güçlü bir çerçeve sağlar ancak anlaşılması ve uygulanması karmaşık olabilir. Bu bölümde, bir etkinliğin yaşam süresi boyunca ve bu durumlarıyla ilişkili yaşam döngüsü yöntemlerine göre gidebileceği farklı durumlar tanıtılmıştır. Daha sonra, bu yöntemlerin her birinde ne tür bir mantık gerçekleştirilebileceğine ilişkin rehberlik sunulmaktadır.






