代码改变世界

Windows Mobile设备常见任务开发(4)--状态与通知

2010-12-25 14:29  MagicKing110  阅读(2180)  评论(0编辑  收藏  举报

摘要:移动开发者社区开发杂志《Windows Phone应用开发专题 第一季》中我参与编写的部分,《Windows Mobile设备常见任务开发》。主要介绍了Windows Mobile中最常见的几个开发任务,如拨打电话、发送短信、联系人管理等等,点此转到索引页。本节主要介绍状态与通知相关开发任务。

相关链接:

Windows Mobile设备常见任务开发(1)

Windows Mobile设备常见任务开发(2)--个人信息管理

Windows Mobile设备常见任务开发(3)--语音呼叫与短消息

 

状态与通知

从Windows Mobile 5.0开始,Windows Phone引入了一套新的状态与通知机制,称为State and Notifications Broker。State and Notifications Broker提供了一种在注册表中存储系统信息或应用程序信息的机制,并可以在所存储的信息发生改变时提供通知(实际功能类似于以前的Status Store/ StatStor/StatStore)。该机制的引入,使我们可以轻松的对系统状态或注册表键值改变作出反应,引发相应事件。

例如,我们可以在应用程序中监视电池电量(系统信息)的变化,当电池电量变化时我们的应用程序会得到通知,如果需要我们就可以在应用程序中针对电量的变化作出反应,调用相应的处理程序;我们也可以想注册表中添加一个新的键值(应用程序信息),并在其值发生变化时触发相应事件。

State and Notifications Broker可以用于监系统中的任何注册表键值。在头文件snapi.h中,包含了对所有系统提供通知的注册表键、路径、键值、二进制掩码的定义。常用的通知包括:

  • 系统状态信息,如功能特性(摄像头、键盘)、活动应用程序、电池状态等
  • 消息信息,如未读条数、最后接收、账户信息等
  • 任务与约会信息,如将来的、过期的、位置等
  • Windows Media Player信息,如当前播放的专辑、艺术家等
  • 电话信息,如信号信息、操作信息、呼叫信息等
  • 连接信息,如蓝牙、蜂窝、网络、调制解调器等

在学习本文的同时,建议参考Windows Mobile 6 SDK:

  • 主题页面:State and Notifications Broker
  • 重点关注命名空间:Microsoft.WindowsMobile.Status 
  • SDK示例代码项目:
    C:\Program Files\Windows Mobile 6 SDK\Samples\Pocket PC\StateAndNotificationBrokerViewer
    C:\Program Files\Windows Mobile 6 SDK\Samples\Smartphone\CS\StateAndNotificationBrokerViewer

 

获取系统状态信息

 Microsoft.WindowsMobile.Status 命名空间中SystemState类,是State and Notifications Broker中的核心类。该类中定义了很多包含系统状态信息的静态属性,通过这些静态属性,我们可以快速地访问到所有可用的系统属性。

下面的示例代码向屏幕上的label1中输出了部分常用的系统状态信息(运行代码前请不要忘记对命名空间的引用)。

private void Form_GetState_Load(object sender, EventArgs e)
{
	label1.Text+="ActiveSync状态:" + SystemState.ActiveSyncStatus.ToString() + "\r\n";
	label1.Text+="电池电量状态:" + SystemState.PowerBatteryStrength.ToString() + "\r\n";
	label1.Text+="蜂窝信号强度:" + SystemState.PhoneSignalStrength.ToString() + "\r\n";
	label1.Text+="设备锁定状态:" + SystemState.LockStates.ToString() + "\r\n";
	label1.Text+="WIFI是否连接:" + SystemState.WiFiStateConnected.ToString() + "\r\n";
	label1.Text+="设备主人姓名:" + SystemState.OwnerName.ToString() + "\r\n";
}

通过SystemState类的静态属性,还可以访问到很多其他的状态信息,具体可以参考SDK中SystemState类的属性列表,也可以参考SDK中的示例代码。

当然,你也可以通过SystemState类的GetValue方法来获取系统状态,此时需要一个SystemProperty枚举参数,相关示例可直接参考SDK示例代码。

需要提醒的一点是,由于注册表所支持的数据类型有限,因此你通过SystemState类获取到的值可能不是你所期望的数据类型,这时你可能需要进行一下强制类型转换。

 

监视状态改变

对状态的变化采取响应,可能是我们最关心的问题。 此时我们需要关注SystemState中的公共事件Changed。通过为Changed事件添加事件处理程序,我们可以轻松的实现对状态变化的监控。

下面的代码演示了在电池电量变化时向屏幕上的label1控件中输出当前时间及电池电量信息。

private void Form_StateChangeNotification_Load(object sender, EventArgs e)
{
	SystemState batteryStrength = new SystemState(SystemProperty.PowerBatteryStrength);
	batteryStrength.Changed += new ChangeEventHandler(batteryStrength_Changed);
	label1.Text += DateTime.Now.ToString() + "\r\n" + SystemState.PowerBatteryStrength.ToString() + "\r\n\r\n";
}

void batteryStrength_Changed(object sender, ChangeEventArgs args)
{
	//args参数中的NewValue属性包含了变化后的新的属性值,
	//实际上与SystemState.PowerBatteryStrength等同
	label1.Text += DateTime.Now.ToString() + "\r\n" + args.NewValue.ToString()+"\r\n\r\n";
}

上面演示的是监视系统默认状态,实际上监视其他如应用程序定义的系统状态信息也是类似的方法,只是在构造SystemState类时使用另外的重载就行了。具体用法请参考下文中示例。

 

添加新的系统状态并监视其变化

在应用程序中,我们可以注册一个新的系统状态,并监视其变化。在注册新的系统状态时,我们为这个状态赋予一个程序启动ID作为其唯一标识。为了防止ID冲突,在注册新的系统状态前,最好先用SystemState的静态方法IsApplicationLauncherEnabled进行判断。

以下代码示范了注册一个新的系统状态myAppState并在其变化时触发myAppState_Changed事件。

private void Form_MyAppState_Load(object sender, EventArgs e)
{
	if (SystemState.IsApplicationLauncherEnabled("myAppState"))
	{
		myState = new SystemState("myAppState");
	}
	else
	{
		myState = new SystemState(SystemProperty.CradlePresent);
		myState.EnableApplicationLauncher("myAppState");
	}

	myState.Changed += new ChangeEventHandler(myAppState_Changed);
}

void myAppState_Changed(object sender, ChangeEventArgs args)
{
	//处理myAppState变化事件
}

 

添加新的注册表状态并监视其变化

以上主要介绍对系统状态(SystemState)的监视,本部分则主要介绍对注册表中任意键值的添加及监视。

本部分重点关注的是Microsoft.WindowsMobile.Status命名空间中RegistryState类。实际上,RegistryState类SystemState类有着共同的基类StateBase,他们中的核心成员大都是从基类StateBase中继承过来的,因此他们有着很多相同的属性和及其相似的行为,在用法上也大同小异。

下面的示例演示了向注册表中添加一个新的注册项"HKEY_LOCAL_MACHINE\\MyRegistryKey"并在其值变化时触发"state_Changed"事件。

private void Form_RegistryState_Load(object sender, EventArgs e)
{
	RegistryState state = new RegistryState("HKEY_LOCAL_MACHINE\\MyRegistryKey", "MyRegistryValue");
	state.Changed += new ChangeEventHandler(state_Changed);
}

void state_Changed(object sender, ChangeEventArgs args)
{
	//处理MyRegistryKey变化事件
}

 

示例代码下载:StateAndNotification.zip

小结:通过本节的学习,我们看到了State and Notifications Broker机制的方便之处,我们可以用纯粹的托管代码来访问一些以前必须用本地代码才能访问到的系统状态信息和注册表信息,同时可以很方便的进行设置,使得这些状态信息或注册表信息发生变化时,触发相应的事件。当然,这些只是与状态和通知相关的最基本的操作,更深入的内容,我们将在后续文章中继续介绍,敬请关注!