纵览
像其它移动设备一样,MID应能依靠电池在移动中使用,在不同的场合,不同的网络联接条件……
接收和操作事件,例如设备状态改变、特殊硬件时间、低电量、系统广播信号,是RPC为MID应用程序设计提供的最常用功能。
一般来说,LibOSSO通过3个步骤可以接受和操作事件:
1. 通过LibOSSO文件原因实现必须的事件操作回调函数。
2. 注册/签署事件设置回调函数参数。
3. 依据事件类型,可以从LibOSSO注销回调函数。
硬件事件
D-Bus从硬件或系统底层传送事件或信号。应用程序可签署一或多个此类事件,并完全控制它们。LibOSSO不支持全部,但支持大多数常用的系统信号,包括:
- 设备模式改变:该设备模式被改变(例如从电源模式进入电池模式)。
- 关机事件:设备或系统将被关闭。
- 低内存事件:设备或系统的内存不足。
- 停止事件:通报应用程序减少活动,通常在显示器关闭时不公开传送。
- 保存用户数据事件:提示应用程序保存数据。(详见自动保存)。
在接收和操作硬件时间中,需要三个步骤:
1. 参照LibOSSO文件参数定义实现回调函数。顾名思义,该函数将在发生硬件事件时调用。
2. 调用“osso_hw_set_event_cb”函数去注册回调函数,指定应用程序要监听的消息类型(定义在LibOSSO API中)。
3. 当应用程序不打算再接收信号,通过LibOSSO API“osso_hw_unset_event_cb”注销回调函数。
下列代码片段示范该过程:
//
// Implement the callback for handling hw event
//
void osso_hardware_event_cb (osso_hw_state_t *state, gpointer data)
{
g_print ("Calling 'osso_hardware_event_cb'.../n");
g_assert (state != NULL);
}
……
//
// Register the callback and subscribe the signals you want to listen
//
ret = osso_hw_set_event_cb (
osso_context,
NULL,
osso_hardware_event_cb,
(gpointer)app_data);
if (ret != OSSO_OK)
{
g_error ("failed to exec 'osso_hw_set_event_cb'/n");
return;
}
.......
// Clean up
//
if (osso_context != NULL)
{
osso_hw_unset_event_cb (osso_context, NULL);
osso_deinitialize (osso_context);
osso_context = NULL;
}
系统时间和现场事件
系统时间和现场改变时间是两种可被系统和其它应用程序触发的事件。应用程序可选择接受事件或发出信号。简单步骤如下:
1. 参照LibOSSO文件参数定义实现回调函数。一旦时间或现场改变事件发生,这些函数将被调用。
2. 调用“osso_locale_change_set_notification_cb”或“osso_time_set_notification_cb”函数注册回调函数,定义哪类事件将被应用程序监听。
3. 当应用程序不再接受这些信号,注销回调函数通过LibOSSO API “osso_hw_unset_event_cb”。
4. 如果应用程序改变时间和现场以及进入系统时它打算广播消息,可调用“osso_time_set”或“osso_locale_set”API函数。
与硬件事件控制不同,不需要注销时间或现场回调。这些回调将在结束应用程序时关闭。
下面是一个范例:
//
// Implement the callback for handling time event
//
void osso_time_event_cb (gpointer data)
{
status_print ("Calling 'osso_time_event_cb'...", data);
//
// System time change event received.
// Todo: put application specific processing code here
//
return;
}
……
//
// Register the callback and listen tme change event
//
ret = osso_time_set_notification_cb (
osso_context,
osso_time_event_cb,
(gpointer)app_data);
if (ret != OSSO_OK)
{
g_error ("failed to exec 'osso_time_set_notification_cb' /n");
return;
}
……
//
// No clean up is required. However
//
……
翻译:徐诚
本文译自Moblin.org技术社区, 点击此处,查看原文