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

0 dakikada yazıldı

26529 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#]

        public MainPage()
        {
            InitializeComponent();
            App.Current.Resuming += new Windows.UI.Xaml.EventHandler(Current_Resuming);
            App.Current.Suspending += new SuspendingEventHandler(Current_Suspending);
        }

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#]

        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#]

        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.
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.

Ya JavaScript ile yapsaydık?

İ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]

    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]

    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.