Makale Özeti

Bu makalemde bir mobil aygıt üzerinde meydana gelen tüm değişikliklerin nasıl takip edebilebileceğini anlatacağım. Örnek vermek gerekirse, bir cevapsız çağrı olduğunda, pil azaldığında, cihaz cradle'a takıldığında, kapsama alanı dışına çıkıldığında nasıl haberdar olacağımızı inceleyeceğiz. Tüm haberdar olabileceğimiz durum bilgisinin bu kadar olduğunu sanmayın farklı farklı 140 adet bilgi var. Bu sayede uygulamamızda bu durumlar gerçekleştiğinde farklı işlemler yapmak istiyorsak bunları yapabileceğiz

Makale

         Merhabalar

         Bu makalemde bir mobil aygıt üzerinde meydana gelen tüm değişikliklerin nasıl takip edebilebileceğini anlatacağım. Örnek vermek gerekirse, bir cevapsız çağrı olduğunda, pil azaldığında, cihaz cradle'a takıldığında, kapsama alanı dışına çıkıldığında nasıl haberdar olacağımızı inceleyeceğiz. Tüm haberdar olabileceğimiz durum bilgisinin bu kadar olduğunu sanmayın farklı farklı 140 adet bilgi var. Bu sayede uygulamamızda bu durumlar gerçekleştiğinde farklı işlemler yapmak istiyorsak bunları yapabileceğiz. Bu işlemleri yapabilmek için öncelikle bir smart device projesi açıyoruz ve bilgileri aşağıdaki gibi seçiyoruz. Göstereceğim örnek Windows Mobile 5.0 üzerinde olacaktır ancak Windows Mobile 6.0 ile de çalışmaktadır.



Bu işlemin hemen ardından uygulamamıza Microsoft.WindowsMobile.Status ve Microsoft.WindowsMobile referansını eklememiz gerekiyor.


Şimdi ise kullanacağımız esas class'ımız olan SystemState class'ını inceleyelim. Class'ımız Microsoft.WindowsMobile.Status.SystemState yolunda bulunmaktadır.Yapısına bakacak olursak;

Property'leri

ApplicationArguments(string) ApplicationLauncher'ın EnableApplicationLauncher metodu ile enable edilmesi durumunda SystemState class'ı tarafından yakalanan bir durumda çalıştırılacak uygulamaya geçecek parametreler'in barındırıldığı property'dir.
ApplicationToLaunchId(string) SystemState class'ı tarafından çalıştırılacak uygulamanın Id'sinin tutulduğu property'dir. Bu property readonly'dir ve değeri EnableApplicationLauncher veya DisableApplicationLauncher metodu ile değişmektedir.
ApplicationToLaunch(string) SystemState class'ı tarafından çalıştırılacak uygulamanın yolunun tutulduğu property'dir.Bu property readonly'dir ve değeri EnableApplicationLauncher veya DisableApplicationLauncher metodu ile değişmektedir.
ComparisionType(StatusComparisionType) SystemState tarafında bir değişiklik olduğunda changed event'ının fırlamasından önce bu değişikliğin belirli bir kritere uyup uymadığının kontrol edilebilmesi için gerekli karşılaştırma operatörünün bulunduğu enum'dur.
ComparisionValue(object) SystemState tarafında bir değişiklik olduğunda changed event'ının fırlamasından önce bu değişikliğin belirli bir kritere uyup uymadığının kontrol edilebilmesi için gerekli karşılaştırma kriteridir.
CurrentValue(object) SystemState tarafından takip edilen özelliğin şu anki değerini verir.
Property(SystemProperty) SystemState tarafından takip edilen özellik bilgisidir.

Metod'ları
GetValue SystemState sınıfı ile ilişkilendirilmiş özelliğin mevcut değerini veren metoddur.
IsApplicationLauncherEnabled ApplicationLauncher'ın enable olup olmadığı bilgisini verir.
EnableApplicationLauncher ApplicationLauncher enable edilir. Bu metoda parametre olarak bir Id ve application'un yolu geçilmelidir.
DisableApplicationLauncher Id'si verilen application'ın artık launch edilmemesini sağlar.

Event'ları
Changed SystemState tarafından takip edilen bir özellik değiştiğinde bu event fırlar. Bu sayede değişen değeri okumamız mümkün olur.

SystemProperty SystemState'in hangi özelliği takip edeceği bilgisini barındıran enumeration'dır. Eğer değişikliklerde SystemState'in changed event'ının fırlatılması isteniyorsa bu özellik SystemState class'ının constructor'unda verilmelidir. Bu özelliğin sadece değerinin okunması isteniyorsa SystemState class'ının her bir SystemProperty için static bir property'si bulunmaktadır. Bu property'den ilgili özelliğe ait anlık değerler okunabilir. Öncelikle SystemProperty enum'unun bize ne gibi özellikleri takip etme fırsatı sunduğuna bakalım sonra ise SystemState ve SystemProperty'nin kullanımını inceleyelim.

SystemProperty enum'u değerleri:

ActiveApplicationDisplayRotationKeyboardPresentCradlePresent
CameraPresentMessagingSmsUnreadMessagingMmsUnreadMessagingVoiceMailTotalUnread
MessagingVoiceMail1UnreadMessagingVoiceMail2UnreadMessagingActiveSyncEmailUnreadMessagingTotalEmailUnread
MessagingOtherEmailUnreadMessagingLastEmailAccountNameMessagingSmsAccountNameMessagingMmsAccountName
MessagingActiveSyncAccountNameTasksActiveTasksHighPriorityTasksDueToday
TasksOverdueCalendarNextAppointmentSubjectCalendarNextAppointmentLocationCalendarNextAppointmentStart
CalendarNextAppointmentEndMediaPlayerAlbumArtistMediaPlayerTrackBitrateMediaPlayerTrackTitle
MediaPlayerAlbumTitleMediaPlayerTrackArtistMediaPlayerTrackNumberMediaPlayerTrackGenre
MediaPlayerTrackTimeElapsedPowerBatteryStrengthPowerBatteryStatePowerBatteryBackupStrength
PowerBatteryBackupStateTimeDatePhoneSignalStrength
PhoneOperatorNamePhoneTalkingCallerNamePhoneActiveCallCountPhoneProfileName
PhoneProfilePhoneCellBroadcastCalendarNextAppointmentHasConflictOwnerName
OwnerPhoneNumberOwnerEmailOwnerNotesActiveSyncStatus
PhoneMissedCallsHeadsetPresentCarKitPresentSpeakerPhoneActive
PhoneMultiLinePhoneSimFullPhoneNoSimPhoneInvalidSim
PhoneBlockedSimPhoneRadioOffPhoneRadioPresentPhoneRingerOff
PhoneLine1SelectedPhoneLine2SelectedPhoneRoamingPhoneCallForwardingOnLine1
PhoneMissedCallPhoneActiveDataCallPhoneCallBarringPhoneCallOnHold
PhoneConferenceCallPhoneIncomingCallPhoneCallCallingPhoneGprsCoverage
PhoneNoServicePhoneSearchingForServicePhoneHomeServicePhone1xRttCoverage
PhoneCallTalkingPhoneCallForwardingOnLine2CalendarNextAppointmentCalendarNextAppointmentBusyStatus
CalendarNextAppointmentCategoriesCalendarAppointmentCalendarAppointmentSubjectCalendarAppointmentLocation
CalendarAppointmentStartTimeCalendarAppointmentEndTimeCalendarAppointmentHasConflictCalendarAppointmentBusyStatus
CalendarAppointmentCategoriesCalendarHomeScreenAppointmentCalendarHomeScreenAppointmentSubjectCalendarHomeScreenAppointmentLocation
CalendarHomeScreenAppointmentStartTimeCalendarHomeScreenAppointmentEndTimeCalendarHomeScreenAppointmentHasConflictCalendarHomeScreenAppointmentBusyStatus
CalendarHomeScreenAppointmentCategoriesPhoneIncomingCallerNamePhoneLastIncomingCallerNamePhoneIncomingCallerNumber
PhoneLastIncomingCallerNumberPhoneIncomingCallerContactPropertyNamePhoneLastIncomingCallerContactPropertyNamePhoneIncomingCallerContactPropertyID
PhoneLastIncomingCallerContactPropertyIDPhoneIncomingCallerContactPhoneLastIncomingCallerContactPhoneTalkingCallerNumber
PhoneTalkingCallerContactPropertyNamePhoneTalkingCallerContactPropertyIDPhoneTalkingCallerContactConnectionsCount
ConnectionsBluetoothCountConnectionsBluetoothDescriptionsConnectionsCellularCountConnectionsCellularDescriptions
ConnectionsNetworkCountConnectionsNetworkDescriptionsConnectionsNetworkAdaptersConnectionsDesktopCount
ConnectionsDesktopDescriptionsConnectionsProxyCountConnectionsProxyDescriptionsConnectionsModemCount
ConnectionsModemDescriptionsConnectionsUnknownCountConnectionsUnknownDescriptionsConnectionsVpnCount
ConnectionsVpnDescriptionsCalendarEventCalendarEventSubjectCalendarEventLocation
CalendarEventStartTimeCalendarEventEndTimeCalendarEventHasConflictCalendarEventBusyStatus
CalendarEventCategories


Şimdi isterseniz SystemState sınıfının kullanımına dair örnekler yapalım.
Bir özelliğin o andaki değerini SystemState nesnesinin static property'leri ile okuma: 

            MessageBox.Show("PowerBatteryState:" + Microsoft.WindowsMobile.Status.SystemState.PowerBatteryState.ToString());
            MessageBox.Show("PowerBatteryStrength:" + Microsoft.WindowsMobile.Status.SystemState.PowerBatteryStrength.ToString());
            MessageBox.Show("DisplayRotation:" + Microsoft.WindowsMobile.Status.SystemState.DisplayRotation.ToString());
            MessageBox.Show("HeadsetPresent:" + Microsoft.WindowsMobile.Status.SystemState.HeadsetPresent.ToString());

 

Bir özelliğin o andaki değerini SystemState nesnesinin instance'ı ile okuma :

            Microsoft.WindowsMobile.Status.SystemState insSystemState = new Microsoft.WindowsMobile.Status.SystemState(SystemProperty.PowerBatteryStrength);
            MessageBox.Show(insSystemState.CurrentValue.ToString())


Bir özelliğin değişimini takip etmek : 

        private void Form1_Load(object sender, EventArgs e)
        {
            Microsoft.WindowsMobile.Status.SystemState insSystemState = new Microsoft.WindowsMobile.Status.SystemState(SystemProperty.PhoneIncomingCallerNumber);
            insSystemState.Changed += new ChangeEventHandler(insSystemState_Changed);
        }
 
        void insSystemState_Changed(object sender, ChangeEventArgs args)
        {
            MessageBox.Show("Arayan numara : " + args.NewValue.ToString());
        }

 

Bir özelliğin değişimini anonymous delegate ile takip etmek : 

            Microsoft.WindowsMobile.Status.SystemState insSystemState = new Microsoft.WindowsMobile.Status.SystemState(SystemProperty.PhoneIncomingCallerNumber);
            insSystemState.Changed += delegate(object s, ChangeEventArgs args)
            { MessageBox.Show("Arayan numara : " + args.NewValue.ToString()); };

 

Tüm özellikleri takip etmek:

        List<SystemState> list = new List<SystemState>();
        private void Form1_Load(object sender, EventArgs e)
        {
            for (int i = 0; i <= 140; i++)
            {
                SystemState s = new SystemState((SystemProperty)i);
                s.Changed += delegate(object obj, ChangeEventArgs args)
                {
                    txtStatus.Text+= String.Format("{0} tarihinde {1} değeri {2} olarak değişti." + Environment.NewLine,
                        DateTime.Now.ToString(),
                        ((SystemState)obj).Property.ToString(),
                        args.NewValue.ToString()) ;
                };
                list.Add(s);
            }
        }

 

Bu kod parçasındaki en önemli nokta System.State lerin class level bir değişkende tutulması zorunluluğudur. SystemState nesneleri yaşadıkları sürece değişiklikleri takip ederler.

Umarım faydalı bir makale olmuştur.

Tamer Öz
         tamer.oz@yazgelistir.com
         oztamer@hotmail.com