转载时请注明出处和作者联系方式:http://blog.csdn.net/absurd
作者联系方式:李先静<xianjimli at hotmail dot com>
更新时间:2007-5-17
事件管理器基于MVC模型提供一种进程间的通信机制,其主要作用是解开事件的触发者和事件的实现者之的耦合,也为集中处理某些事件提供了方便。现在看来,事件管理器的作用已经大不如以前了,比如下面这些事件,以前由事件管理器处理,而现在已经由其它服务代劳了:
1. 设置改变。用户通过系统设置应用程序修改设置,为了避免系统设置与其它功能之间的耦合,在系统设置中直接让设置生效是不合适的。通常做法是触发一个设置改变的事件,该事件被传递到相应的应用程序,由于该应用程序做出处理。
现在的设置信息通过gconf存取,而不是直接存取配置文件。由于gconf实现了配置变化通知机制,它可以直接通知应用程序,自然不需要事件管理器操心了。
2. 硬件变化,通知应用程序做相应处理。比如手机插上充电器,状态栏要显示充电动画。插上/拔除SD卡,文件浏览器要更新相应的图标,如此等等。
现在这些硬件变化事件,已经由udev+hal来通知应用程序了。hal也是基于MVC模型实现的,应用程序向它注册事件就行了,也不需要事件管理器操心了。
事件处理器当然还有它存在的空间,比如:
1. 存储空间不足。手机上的存储空间非常有限,存储空间不足的现象是常见的,这时要提醒用户删除一些数据。不可能在每处写文件时都判断,然后弹出对话框提醒用户,特别在是非GUI的程序中,更不能如此。这时可以触发一个存储空间不足的事件,触发者不需要关心事件如何处理。我们可以让状态栏充当事件处理者,它弹出一个提示框,或者显示存储空间不足的状态。
2. 时间改变。修改系统时间,也会影响其它一些应用程序的行为,比如闹钟、日程和其它alarm相关应用程序,它们需要调整自己的数据。这时可以通过事件管理器,触发一个事件通知其它应用程序。
一般平台都会有类似的功能,可能名字会有所不同,功能上有强有弱。比如Access的ALP中的notifymanager,PC上的libnotify和notifydaemon。ALP的notifymanager功能强大,它支持同步事件,不过用处不大。PC上的libnotify和notifydaemon的主要功能只是提示用户,而且严重依赖X Window,移植比较困难。最终我决定自己开发,它提供了如下接口:
1. triger_event 触发一个事件,触发时可以指定事件的状态,也可以指定其它一些信息,比如有效期和触发者ID等。
2. query_event 查询一个事件的状态,有的事件有状态,可以调用此函数查询它的状态和其它信息。
3. reg_event 注册事件处理函数。当有事件触发时,调用注册的回调函数,如果回调函数为空,则视为注销。
~~end~~