在应用非正常退出时利用StateSaver来保存我们的数据

我们知道Ubuntu手机平台是一个单任务的系统。一个用户可以开启很多个应用,但是只有前台的应用是可以正在运行的应用。很多被推到后台的应用被驻存到内存中。如果有很多这样的被驻存的应用的话,内存迟早会被用完的。操作系统可以选择一些应用被杀死从而保证系统的正常运行。为了能够保证应用在退出时的状态,在Ubuntu系统上,我们设计了StateSaver这样的一个接口。它可以用来帮我们保存应用在非正常退出的状态,以便在应用重新启动后恢复以前的状态。

参照文章的设计,我们设计了如下的代码:

import QtQuick 2.0
import Ubuntu.Components 1.1

/*!
    \brief MainView with a Label and Button elements.
*/

MainView {
    id: mainview
    // objectName for functional testing purposes (autopilot-qt5)
    objectName: "mainView"

    // Note! applicationName needs to match the "name" field of the click manifest
    applicationName: "statesaver.ubuntu"

    /*
     This property enables the application to change orientation
     when the device is rotated. The default is false.
    */
    //automaticOrientation: true

    // Removes the old toolbar and enables new features of the new header.
    useDeprecatedToolbar: false

    width: units.gu(60)
    height: units.gu(85)

    Page {
        id: mainpage
        title: i18n.tr("State saver")

        Rectangle {
            id: root
            anchors.fill: parent
            color: "green"
            StateSaver.properties: "color"

            Column {
                spacing: units.gu(2)
                anchors.centerIn: parent

                Button {
                    anchors.horizontalCenter: parent.horizontalCenter
                    text: "Change color"

                    onClicked: {
                        root.color = Qt.rgba(Math.random(1), Math.random(1), Math.random(1), 1);
                    }
                }

                Button {
                    anchors.horizontalCenter: parent.horizontalCenter
                    text: "Quit"

                    onClicked: Qt.quit()
                }

            }
        }
    }
}

运行我们的应用:

我们可以按下“Change color”来改变我们的颜色。当我们按下“Quit”后,退出应用。但是,等我们重新启动我们的应用后,在应用退出时的颜色还是当初始化的颜色绿色。也就是说我们在程序中使用的:

StateSaver.properties: "color"

没有帮我们保存下我们的颜色。

接下来,我们重新运行我们的应用,并调整好我们所需要的颜色,比如蓝色:

我们在电脑上打开我们的Terminal,并输入如下的命令:

我们可以看到我们的应用被无情地杀死了。我们再次在手机中打开我们的应用。我们可以看到应用启动后,颜色还是上次在被杀死时的蓝色,而不是应用在初始化的绿色。也就是说,颜色的值在进程被杀死的时候被保存下来了。

我们可以参阅文章来保存多个properties。

整个应用的代码在:git clone https://gitcafe.com/ubuntu/statesaver.git

时间: 2024-10-12 12:37:01

在应用非正常退出时利用StateSaver来保存我们的数据的相关文章

Vim中的swp文件,在vim非正常退出时,再次编辑会出问题

vim中的swp即swap文件,在编辑文件时产生,它是隐藏文件,如果原文件名是data,那么swp文件名就是.data.swp.如果文件正常退出,则此文件自动删除.以下两种情况不会删除swp文件: Vim非正常退出,这种情况下,除非手动删除swp文件(也可以在vim提示时删除),否则它会一直存在. 多个程序同时编辑一个文件. 可以通过选项禁止产生swp文件 set noswapfile

利用偏好设置保存必要的数据

---恢复内容开始--- 偏好设置只要用于保存用户名.密码.自动登录等功能,适合一些应用的登陆界面保存数据,使用的简单步骤如下 1.读取上次保存的设置 NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults]; // 直接访软件的偏好设置 [defaults  setObject:@"haha"  forKey:@"userName"];  // 存储数据 [defaults  setObje

vim编辑时非正常退出处理方法

当我们在linux系统用vim编辑一个文件时,由于断电或其他的原因,比如用的ssh连接的端口,网络中断而关闭等.当再次编辑这个文件时会有提示: "filname.swp" already exists![O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit: 当再次按确认键,可进入编辑模式,每次进入都会问你一遍,比较麻烦,为了解决这个问题,我们很有必要讨论一下为什么会产生这个吧 因为当vim编辑一个文件时系统会自动产生一个相同文件作为备份,

linux c开发: 在程序退出时进行处理

有时候,希望程序退出时能进行一些处理,比如保存状态,释放一些资源.c语言开发的linux程序,有可能正常退出(exit),有可能异常crash,而异常crash可能是响应了某信号的默认处理.这里总结一下这些情况,如何获取一个统一的退出处理的点,说白了就是写一个回调函数,让他在程序正常或异常退出时调用. 先看正常退出,即调用exit或者main函数return亦或最后一个线程正常退出时,如何捕获退出事件. 使用atexit函数.头文件:#include<stdlib.h>, 函数原型:void

Android设置Activity启动和退出时的动画

业务开发时遇到的一个小特技,要求实现Activity启动时自下向上弹出,退出时自上向下退出. 此处不关注启动和退出时其他Activity的动画效果,实现方法有两种: 1.代码方式,通过Activity的overridePendingTransition接口, 即在startActivity时调用overridePendingTransition(R.anim.push_bottom_in, 0) 在finish时调用overridePendingTransition(0, R.anim.push

win7 64 下 VS2008 调试、退出时错误的解决

最近调试老程序的时候发现原来的VS2008会偶尔在调试C++程序的时候出现程序未响应的情况,开始还以为是个案,后来出现的频率越来越高完全影响心情啊!! 准备花时间解决一下这个问题.网上搜索没有发现任何有价值线索,于是决定用上绝招--安装盘修复,但结果依然是那样.准备用process monitor监测一下,发现信息太多基本不太可能一一人工分析. 在解决问题的时候还发现了一个问题.启动VS2008后,打开一个项目,不做任何修改点全部保存,然后关闭VS2008,此时VS2008会出现异常100%可重

os.waitpid()无法获取sys.exit()退出时的status code

[目的] 父进程使用os.waitpid()等待子进程退出,并检测子进程的exit code,以决定是否重启子进程. (常见的应用场景是:子进程接收外部命令,收到"stop"时退出所有进程,终止服务:收到"restart"时所有子进程退出,父进程重启所有子进程,以达到重启服务的目的). 这里面的关键点在于,子进程退出时设置exit code,父进程waitpid时获取该exit code,进而决定是否需要重启子进程. [问题] 子进程 ...#need restar

机房重构时利用状态模式实现消费时间的计算

在做机房重构时,我们会在学生上下机计算学生上机时间时,会出现消费时间随着基本数据设定表中的数据变化而变化,这里不仅仅是数据的变化,还包括不同时间段内消费时间具体确定问题.主要分为三个时间段的计算 1.准备时间:即在此时间段内,消费金额为0 2.至少上机时间:如果上机时间超过了准备时间,但是少于至少上机时间,那么此时消费时间为至少上机时间 3.按正常消费时间来算:此时,消费时间大于至少上机时间后,则按照正常时间来算 通过对业务的分析,我们发现在不同时间段,最终的消费时间的计算方式是不一样的.如果我

[转载]DllMain中不当操作导致死锁问题的分析--线程退出时产生了死锁

(转载于breaksoftware的csdn博客) 我们回顾下之前举得例子 case DLL_PROCESS_ATTACH: { printf("DLL DllWithoutDisableThreadLibraryCalls_A:\tProcess attach (tid = %d)\n", tid); HANDLE hThread = CreateThread(NULL, 0, ThreadCreateInDllMain, NULL, 0, NULL); WaitForSingleO