Moblin Linux开发手册(四)_UI状态和用户数据自动保存

通常,这些移动设备资源有限,它们将限定能被系统运行的进程最大数量。在Hildon中,应用程序可在前台和后台间切换。后台程序可被任务管理器关闭来释放系统资源。当用户选择应用程序再次在前台运行,Hildon任务管理器将重载它。将这些进程显现给用户,LibOSSO提供UI状态保存和数据自动保存机制。通过使用它们,应用程序可呈现用户同样的外观,在应用程序被关闭到后台又被重载到前台。

UI状态保存函数为应用程序提供保存和提取GUI状态信息(例如浏览最后打开的文件,滚动条位置)的简单方法。使用信息保存功能不能在设备电源关闭时进行,没有机制保存GUI状态在此情况。应用程序调用相应的LibOSSO函数可完整该任务[3]

用户数据通常能设置适当回调被自动保存。这些回调能在“过期数据”计时器到期或应用程序强制调用“osso_application_autosave_forceAPI函数时被调用。

注意,终止后台程序事实上由应用程序自身控制,通过调用“hildon_program_set_can_hibernateAPI。它不是Moblin必需的。自从MID使用IA架构,在计算机电力和内存方面通常拥有丰富的资源,例如,Moblin不需要应用程序进行UI状态保存。我们介绍这些能力只是告诉你LibOSSO提供的功能。

实现UI状态和用户数据自动保存的过程如下:

1.        应用程序读取状态信息通过调用“osso_state_read”在启动期间,如果存在先前GUI状态将向用户展现。

2.        注册回调在应用程序切换后前台时执行。
注意:应用程序可被终止旗帜是设置何时它被转入后台和何时在前台清楚它的指示。

//
// Hook up UI state change event callback function
//
g_signal_connect (
            G_OBJECT(hildon_program),
            "notify::is-topmost",
            G_CALLBACK(window_topmost_status_change_cb),
            (gpointer)app_data);
…… 

//
// Sample callback implementation
//
void window_topmost_status_change_cb(GObject *gobject, GParamSpec *arg,
                                     gpointer data)
{
   EVENT_APP_DATA  *app_data = (EVENT_APP_DATA *)data;

   g_print  ("Calling 'window_topmost_status_change_cb'.../n");
   if (hildon_program_get_is_topmost (app_data->main_program))
   {
     hildon_program_set_can_hibernate (app_data->main_program, FALSE);

   } else {

     //
     // Application switched to background. Since app can be killed in
     // background mode, we need to save UI state and application data
     //
     osso_state_write (app_data->osso_context, &(app_data->ui_state));

     //
     // Force the autosave callback to be called and save app data
     // in this callback
     //
     osso_application_autosave_force (app_data->osso_context);

     //
     // Notify the system this app is now killable
     //
     hildon_program_set_can_hibernate (app_data->main_program, TRUE);
  }
}

3.        通过调用APIosso_application_set_autosave_cb”注册回调函数接收和控制用户数据自动保存函数。在此函数中,应用程序应该使特定用户数据保存函数生效。

//
// Hook up osso app autosave event callback function
//
ret = osso_application_set_autosave_cb (
            osso_context,
            osso_app_autosave_cb,
            (gpointer)app_data);
if (ret != OSSO_OK)
{
    g_error ("failed to exec 'sso_application_set_autosave_cb': %s/n");
    return;
}

 

4.        每当程序切换到后台,使用“osso_state_write()”保存UI状态。

5.        当应用程序未能保存用户数据,调用“osso_application_userdata_changed()”。该调用在自动保存回调超时后出现。

6.        每当应用程序通过自身逻辑转入后台或显现,“osso_application_autosave_force()”可被调用执行立即保存数据回调,这样将强制保存用户数据。

7.        当应用程序退出时,如果程序没有保存用户数据或UI状态,将调用“osso_application_autosave_force()”和“osso_state_save()”。

8.        当应用程序再次启动,将检查是否存在自动保存的用户数据和自动保存的UI状态。如果存在,应用程序可以需要读取这些数据,还有此前用户的GUI状态。

测试示例代码

使用示例“libosso-event”和“libosso-emitter”来测试LibOSSO事件特性。

切换到“libosso-sample/event”目录,通过下列明令建立程序:

$ ./autogen
$ ./configure –-prefix=/targets/$MyTarget/fs/usr
$ make
$ make install

注意,“$Mytarrget”应该被改为你的Moblin目标系统名称。

钱换到“libosso-sample/signal-emitter/”目录,像上面的命令一样建立程序。

控制硬件事件

在映像创建者环境,启动Xephyr,确定在目标的交叉环境中。测试这些用法去控制硬件事件:

$ libosso-event

离开该应用程序回话并在相同目标环境打开另一个终端。输入下列命令来改变设备模式两次。两次改变是确定你能看见模式改变,因为原来的设备模式可能已经是“flight”。“libosso-emitter”应用程序可模拟硬件事件并发送dbus命令在系统总线上。

$ libosso-emitter –w normal
$ libosso-emitter –w flight

切换到“libosso-event”应用程序GUI后,它将启动当前设备模式。现在关闭应用程序,下面是你将看见的记录。

注意显示的API,高亮的是有用的输出信息。

$ Calling "initialize_appplication_osso"
$ Calling "osso_hardware_event_cb"…
$ Current device mode: Normal
$ ...
$ Calling "osso_hardware_event_cb"…
$ Current device mode: Normal
$ Calling "osso_hardware_event_cb"…
$ Current device mode: Flight
$ ...

我们可看到回调函数“osso_hardware_event_cb”被调用三次,函数中将输出当前设备模式。实际上,第一次不是由“libosso-emitter”应用程序发出,然后其它是LibOSSO API发出。

 osso_hw_set_event_cb”被调用,该注册回调将在API报告当前设备模式后立即被调用。同样的事情也发生在显示器事件报告用户当前显示器开关状态。

下列两个回调由应用程序“libosso-emitter”触发,我们能看到,回调函数捕获设备模式改变并输出最近模式到终端。

操作时间/本地事件

Xephyr中启动目标环境,运行“libosso-event”应用程序:

$ libosso-event

离开应用程序会话并打开相同目标环境终端。输入下列命令调用“osso_time_set”或“osso_locale_setAPI函数模拟系统时间/本地改变事件。

$ libosso-emitter –t
$ libosso-emitter –l

切换到“libosso-event”应用程序GUI后并关闭它,你应该能看到终端中下列文本输出。

注意我们显示的API,高亮显示的是有用的输出信息。

$ Calling 'initialize_appplication_osso'...
$ ...
$ Calling 'osso_time_event_cb'...
$ Calling 'osso_locale_change_cb'...
$ ...

结果显而易见,在收到时间或本地改变信号后,时间或本地时间对应的两个调用被触发。

控制UI状态保存和用户数据自动保存

Xephyr中启动目标环境,执行“libosso-event”应用程序:

$ libosso-event

输入一些文本在UI中,切换应用程序从后台到前台一或二次。关闭应用程序检查输出信息:

$ Calling "initialize_appplication_osso"…
$ ...
$ Calling "window_top_most_status_change_cb"…
$ Calling "textview_text_changed_cb"…
$ ...
$ Calling "window_top_most_status_change_cb"…
$ Calling "osso_app_autosave_cb"…
$ ...

如结果所显示,自动保存回调将在文字改变时(需要等待少许时间)或切换带有未保存数据的应用程序到后台被触发。UI状态保存不是自动的,所以你可能需要查阅示例代码中状态的读写部分。

参考


1.        Maemo Online Training - Technology Overview - http://maemo.org/development/training/maemo_technology_overview_content.html

2.        Maemo Online Training - Application Development - http://maemo.org/development/training/maemo_application_development_content.html

3.        Maemo Online Training - Platform Development - http://maemo.org/development/training/maemo_platform_development_content.html

4.        Maemo 4 Architecture - http://maemo.org/development/documentation/how-tos/4-x/maemo_architecture.html

5.        Hildon Reference Manual - http://maemo.org/api_refs/4.0/hildon/index.html

6.        LibOSSO Documentation - http://maemo.org/api_refs/4.0/libosso/index.html


翻译:徐诚

本文译自Moblin.org技术社区,  点击此处,查看原文


               更多内容,到“Moblin技术中国”专区


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值