следующей назначенной встрече (Appointment), обрабатывать информацию о проигрываемом музыкальном файле, получать информацию о контактах и количестве не прочитанных электронных писем, SMS- сообщений и пропущенных телефонных звонков.
Чтобы использовать возможности State and Notifications Broker в приложениях, надо добавить ссылку на сборку Microsoft.WindowsMobile.Status
. Также необходимо добавить ссылку на сборку Microsoft.WindowsMobile
. После этого программа готова использовать классы пространства имен Microsoft.WindowsMobile.Status
.
Конечно, без наглядного примера обойтись просто нельзя. Предположим, что нас интересует информация о владельце устройства и необходимо отслеживать изменение этой информации. Для этого надо создать новый проект и добавить на форму элемент Label
. Этого вполне достаточно для работы примера. Также необходимо добавить ссылки на сборки Microsoft.WindowsMobile
и Microsoft.WindowsMobile.Status
при помощи команды меню Project►Add Reference
. Нас интересует изменение электронного адреса владельца устройства. Для этого используется код, приведенный в листинге 10.13.
using Microsoft.WindowsMobile.Status;
private SystemState sysState;
sysState = new SystemState(SystemProperty.OwnerEmail, true);
sysState.Changed += new ChangeEventHandler(sysStateChanged);
private void sysState_Changed(object sender, ChangeEventArgs args) {
lblOwnerEmail.Text = SystemState.OwnerEmail;
}
Протестируем пример. После запуска приложения с ним не нужно ничего делать. Следует нажать кнопку Пуск
и выбрать пункт меню Настройка
. На вкладке Личные
нужно активировать пиктограмму Данные о владельце
. В соответствующем текстовом поле Эл.почта
следует изменить указанный адрес электронной почты. Если теперь вернуться к приложению, то можно будет увидеть, что изменилось содержимое надписи lblOwnerEmail
. Таким образом, программа автоматически отреагировала на изменение данных в настройках системы. Конечно, можно получать данные об электронном адресе владельца в принудительном порядке. Для этого используется код, приведенный в листинге 10.14.
private void butGetEmail_Click(object sender, EventArgs e) {
//Получим email владельца устройства
lblOwnerEmail.Text = SystemState.OwnerEmail;
}
Да, с помощью этого кода можно получить интересующие данные, но в этом случае нельзя узнать, когда эти данные изменятся. Придется через определенные промежутки времени проверять, не изменился ли адрес у владельца устройства.
Но стоит вернуться к примеру уведомления об изменении электронного адреса владельца устройства. Отслеживанием изменений в системе занимается класс SystemState
. Данный класс содержит множество статичных свойств для получения различных настроек системы. Но кроме этого класс SystemState
содержит очень важное событие Changed
. Для обработки данного события нужно сначала создать экземпляр класса SystemState
и передать ему соответствующее свойство:
sysState = new SystemState(SystemProperty.OwnerEmail, true);
Затем нужно присоединить делегат к новому экземпляру события Changed
:
sysState.Changed += new ChangeEventHandler(sysState_Changed);
А уже после этого можно перехватывать изменение состояния нужных параметров:
private void sysState_Changed(object sender, ChangeEventArgs args) {
lblOwnerEmail.Text = SystemState.OwnerEmail;
}
Пример с электронным адресом был приведен лишь для ознакомления. На самом деле, с помощью соответствующих свойств можно получить доступ более чем к ста системным настройкам. Наиболее внимательные читатели могут заметить, что State и Notifications Broker порой дублируют функциональность, которую можно воспроизвести при помощи других средств. Например, текущую ориентацию экрана можно узнать с помощью функции API GetSystemMetrics
или с помощью вызова Screen.PrimaryScreen.Bounds
. А информацию о заряде батареи можно узнать с помощью функции GetSystemPowerStatusEx
.
Но зачем понадобилось создавать еще одну дополнительную возможность извлечения информации? Причин для такого шага было несколько. Прежде всего, новые возможности удобны и просты. В предыдущем примере было показано, что для получения электронного адреса владельца устройства достаточно вызвать одно соответствующее свойство. Для получения других значений также вызываются соответствующие свойства. Причем названия этих свойств говорят сами за себя и не требуют наличия под рукой справочной литературы.
Для закрепления материала нужно дополнить программу еще несколькими примерами получения различных свойств. Можно добавить отображение уровня заряда батареи, текущего состояния батареи, наличия радиоприемника и фотокамеры, названия сотового оператора и определение текущей ориентации экрана. Все это делает код, приведенный в листинге 10.15.
private void butGetInfo_Click(object sender, EventArgs e) {
lstInfo.Items.Add('Название оператора: ' + SystemState.PhoneOperatorName);
lstInfo.Items.Add('Наличие радио: ' + SystemState.PhoneRadioPresent);
lstInfo.Items.Add('Наличие камеры: ' + SystemState.CameraPresent);
lstInfo.Items.Add('Ориентация экрана ' + SystemState.DisplayRotation);
}
private void butBattery_Click(object sender, EventArgs e) {
// Уровень заряда батареи
BatteryLevel batteryLevel = SystemState.PowerBatteryStrength;
BatteryState batteryState = SystemState.PowerBatteryState;
string strBatteryLevel = 'Уровень заряда';
switch (batteryLevel) {
case BatteryLevel.VeryLow:
strBatteryLevel = 'Уровень заряда: Очень низкий (0-20%)';
break;
case BatteryLevel.Low:
strBatteryLevel = 'Уровень заряда: Низкий (21-40%)';
break;
case BatteryLevel.Medium:
strBatteryLevel = 'Уровень заряда: Средний (41-60%)';
break:
case BatteryLevel.High:
strBatteryLevel = 'Уровень заряда: Высокий (61-80%)';
break;
case BatteryLevel.VeryHigh:
strBatteryLevel = 'Уровень заряда: Очень высокий (81-100%)';
break;