Windows 8 Metro Uygulamarında Suspend/Resume İşlemleri

0 dakikada yazıldı

26503 defa okundu

Düzenle

Windows 8 ile beraber gelen MetroUI içerisindeki uygulamalar arası geçişler için Windows Phone 7.5'dekine benzer bir yapı düşünülmüş. Uygulamalar arası geçişlerin hızlı olabilmesi adına ekrandan çıkarılan bir uygulama "Suspend" moduna alıyor. Bu hem uygulama arası geçişleri hızlandırıryor hem de işlemci kullanımının kontrol altına alınarak pil ömrünün korunabilmesini sağlıyor. Suspend modunda bir uygulama herhangi bir şekilde işlemciyi kullanamıyor.

Windows 8'de bu geçişler nasıl oluyor?

Daha Windows 8 Developer Preview sürümünü yükleme şansı olmayanlar için gelin önce hızlıca bir bu uygulamalar arası geçiş dediğimiz konunun son kullanıcı tarafından kullanım şekline göz atalım.

Metro UI'da uygulamalar arası geçişler bu
şekilde...Metro UI'da uygulamalar arası geçişler bu şekilde...

Yukarıdaki gördüğünüz ekran görüntüsü aslında Stock uygulaması ekrandayken Weather uygulamasına geçiş yapma esnasında oluşuyor. Özetlemek gerekirse daha önce açılmış bir uygulamaya geri dönmek için ekranın sol tarafından başlayarak parmağınızla sanki ekranın dışından birşeyi içeriye alıyormuş gibi sürükleme hareketi yapıyorsunuz. Bu esnada bir önceki uygulama bu şekilde ekrana geliyor ve bıraktığınızda ise tam ekranı kaplayarak aktif hale geliyor. Ekranın sol tarafından aldığınız her uygulama daha önce açtığınız fakat sonra ya başka bir uygulamaya geçtiğiniz için ya da ana ekrana döndüğünüz için "Suspend" olmuş uygulamalar oluyor. Sırası ile tek tek ekrana alarak bu liste içerisinde gezebiliyorsunuz.

Suspend mekanizmasına uygun uygulama yazmanın yolu.

Doğal olarak kendi uygulamalarınızı yazdığınızda bu Suspend mekanizmasından haberdar olmak ve duruma göre hareket etmek önemli olacaktır. Örneğin uygulamanız Suspend olduğunda ekrandaki bazı dataları veya durumu diske veya belki de online bir servise kaydetmek isteyebilirsiniz. Suspend olan uygulamalar geri geldiklerinde bire bir eski halleri ile geliyorlar. O nedenle bir anlamda "State"i yani Suspend olmadan önceki hali bir yerlere kaydetmemizin en önemli nedeni Suspend olan bir uygulamanın Resume olmadan önce sonlanması. Şimdilik Suspend olan uygulamaların sayısı vs ile ilgili bir sınır yok ama sonuçta kullanıcı tabletini tamamen kapayabilir, pili bitebilir veya kasten kapatabilir veya uygulama takılabilir. Bir diğer senaryo ise kullanıcının tabletinde suspend olan bir uygulamayı sonra Desktop bilgisayarında açması ve Desktop'ta aynı uygulamanın aynı state'den online bir servisten state bilgisini alıp devam etmesi. Bu ve bu gibi farklı nedenlerle Suspend ve Resume durumlarını yakalamak ve gerekli işlemleri aralara sokmak şart.

[C#]

``` {style="font-family: Consolas; font-size: 13; color: black; background: white;"}         public MainPage()         {             InitializeComponent();             App.Current.Resuming += new Windows.UI.Xaml.EventHandler(CurrentResuming);             App.Current.Suspending += new SuspendingEventHandler(CurrentSuspending);         }

Sıfırdan yarattığımız bir Metro UI Silverlight uygulamasında hemen
yukarıdaki kod ile kolaylıkla **Resume** ve **Suspend** durumları için
ayrı ayrı event listener'lar ataçlayabiliyoruz. Bu event listenerlar
çalıştırıldığında yapmak istediğiniz işlemler tabi ki size kalıyor.

**[C\#]**

``` {style="font-family: Consolas; font-size: 13; color: black; background: white;"}
        void Current_Suspending(object sender, 
        Windows.ApplicationModel.SuspendingEventArgs e)
        {
            SuspendingDeferral deferral = e.SuspendingOperation.GetDeferral();

            TXTBlock.Text += "\nSuspend olmuşum";

            deferral.Complete();
        }

Yukarıdaki kod Suspending eventine ait listener implementasyonumuz. Kod içerisinde ben basit bir şekilde ekrana koyduğumuz bir TextBlock'a yazı yazıyorum. Fakat bunun haricinde iki satır daha kodumuz var yukarıda. Bunlardan ilki SuspendingEventArgs üzerinden SuspendingOperation'ın Deferral'ını alıyor. Diğer, en son satır ise deferral üzerinden Complete metodunu çağırıyor.

 Suspend operasyonu daha önce de bahsettiğimiz gibi herhangi bir uygulama ekrandan çıkarıldığını anda işletim sistemi tarafından gerçekleştiriliyor. Biz yukarıdaki kodumuzda işletim sistemine "GetDefferal" diyerek aslında bir geciktirme talebi göndermiş olduk. Bu geciktirme en fazla beş saniye olabiliyor. Beş saniye içerisinde istediğimiz işlemleri yapıp Complete metodu ile işimizin bittiğini işletim sistemine bildirdiğimiz anda Suspension başlıyor. Eğer beş saniyede Complete demezsek, artık istesek de istemesek de uygulamamız suspensiona alınıyor.

[C#]

``` {style="font-family: Consolas; font-size: 13; color: black; background: white;"}         void Current_Resuming(object sender, object e)         {             TXTBlock.Text += "\nResume de olmuşum";         }

Resume işleminde de aslında Suspend'de yaptıklarınızın tam tersini
yapmanız yani bir anlamda daha önce kaydedilen durum bilgilerini tekrar
ekrana getirmeniz / restore etmeniz gerekecektir.

![Suspend ve Resume işlemlerini Visual Studio'dan
tetiklemek.](http://cdn.daron.yondem.com/assets/2700/suspend_trigger.png)\
*Suspend ve Resume işlemlerini Visual Studio'dan tetiklemek.*

Uygulamalarınızı test ederken Visual Studio'dan uzaklaşıp MetroUI'da
uygulamalar arası geze geze Resume/Suspend'i takip etmenize gerek yok :)
Visual Studio içerisinde Debug menüsünde artık doğrudan "Trigger
Suspend" ve "Trigger Resume" komutlarını bulabilirsiniz. Böylece
rahatlıkla testlerinizi yapabilirsiniz.

<h3>Ya JavaScript ile yapsaydık?</h3>

İtiraf etmek gerekirse her Metro UI makalemde hem C\# hem JavaScript
yazacak mıyım bilmiyorum :) Bu biraz hem VB hem C\# yazmaya benzer.
Zamanla eminim ki herkes aradaki büyük benzerliği anlayacaktır. Sonuçta
Metro UI söz konusu oldukça tüm bu dillerden yaptığımız tek şey WinRT
API'lerini çağırmak. Ama yine de bu seferlik :) JavaScript tarafındaki
kodun haline de bir göz atalım hızlıca.

**[JavaScript]**

``` {style="font-family: Consolas; font-size: 13; color: black; background: white;"}
    Windows.UI.WebUI.WebUIApplication.
    addEventListener("suspending", suspendingHandler, false);
    Windows.UI.WebUI.WebUIApplication.
    addEventListener("resuming", resumingHandler, false);

Her zamanki gibi yine suspending ve resuming eventlerine birer listener ataçlıyoruz.

[JavaScript]

``` {style="font-family: Consolas; font-size: 13; color: black; background: white;"}     function suspendingHandler(eventArgs) {         var deferral = eventArgs.suspendingOperation.getDeferral();

        // arada birşeyler yapılabilir.         deferral.complete();     } ```

Suspend işlemi başladığında yine eventArgs üzerinden Operation nesnesinin getDeferral metodunu çalıştırıp bir deferral (gecikme) nesnesi istiyoruz WinRT'den. Bu gecikme nesnesini aldıktan sonra işlemlerimizi yapıp yine complete diyerek işi bitiriyoruz.

Hepinize kolay gelsin!

Bu makale Visual Studio 11 Express for Windows Developer Preview\ ve Windows 8 Developer Preview Build 8102 kullanılarak yazılmıştır.