SyberOS 应用程序不能控制它们自己的生命周期。
相反,应用程序必须监听应用程序状态变化并作出适应的反应。
每次应用程序运行时,应用程序的 CWorkSpace 类都保持实例化。
SyberOS 应用程序不能控制它们自己的生命周期。相反,应用程序必须监听应用程序状态变化并作出适应的反应。每次应用程序运行时,应用程序的 CWorkSpace 类都保持实例化。


应用程序的 main 函数一般如下:
#include "symbolworkspace.h"
Q_DECL_EXPORT int main(int argc, char* argv[])
{
return SYBEROS::SyberosGuiCache::qApplication(argc, argv, new symbolWorkspace());
}
symbolworkspace 类的如下:
#include <QQuickView>
#include <cworkspace.h>
#include <SyberosGuiCache>
#include <cgui_application.h>
using namespace SYBEROS;
class symbolWorkspace : public CWorkspace
{
Q_OBJECT
public:
symbolWorkspace(QObject* parent = 0);
void onLaunchComplete(Option option, const QStringList& params); void open(const QStringList& params); void openByUrl(const QUrl& url);
void openByEvent(const QString& event, const QStringList& params);
void openByDocument(const QString& action, const QString& mimetype, const QString& file); void openByMultiDocuments(const QString& action, const QStringList& filelist); void onActive();
void onDeactive();
private:
QQuickView* m_view;
};
symbolWorkspace 的构造函数一般如下:
symbolWorkspace::symbolWorkspace(parent): CWorkspace(parent){
m_view = SYBEROS::SyberosGuiCache::qQuickView();
QObject::connect(m_view->engine(), SIGNAL(quit()), qApp, SLOT(quit()));
m_view->setSource(QUrl("qrc:/qml/main.qml"));
m_view->showFullScreen();
}
通过重写 CWorkspace 类的以下这些方法,可以实现用户自己的功能。
onLaunchComplete(Option option, const QStringList& params)
应用启动结束时,回调此函数。根据传入的 option,应用可以区分启动的方式。
option 取值为 CWorkspace::HOME、CWorkspace::URL、CWorkspace::EVENT、 CWorkspace::DOCUMENT、CWorkspace:: MULTIDOCS 之一,分别代表通过桌面、URL、EVENT、DOCUMENT 以及 MULTIDOCS 启动。
open(const QStringList& params)
应用重入回调接口,当应用是由桌面重入时回调此接口
openByUrl(const QUrl& url)
应用重入回调接口,当应用是由 URL 重入时回调此接口
应用重入回调接口,当应用是由 EVENT 重入时回调此接口
应用重入回调接口,当应用是由 DOCUMENT 重入时回调此接口
应用重入回调接口,当应用是由 MULTIDOCS 重入时回调此接口
应用在被调度到前台时回调此函数
应用在被调度到后台时回调此函数
每一个 CPage 都表示一个屏幕,应用程序会把它呈现给用户,应用程序越复杂,需要的屏幕可能就越多。典型情况下,这至少包含一个用来处理应用程序主 UI 功能的主屏幕界面和一组次要的 CPage 支持的。要在屏幕间切换,就必须要启动一个新的
CPage(或者从一个 CPage 返回)。
每一个 CPage 的状态是由它在 CPageStackWindow 的位置决定的,CPageStackWindow 是当前是所有正在运行的 CPage 后进先出的集合,当一个新的 CPage 启动时,它就变为活动状态,并被移动到栈顶。
如果用户使用 Back(返回)按钮返回到了刚才的 CPage,或者前台 CPage 被关闭了,那么栈中的下一个 CPage 就会移动到栈顶,变为活动状态。
push 一个 CPage:
pageStack.push("qrc:/qml/nextpage.qml", {"text":content})
pop 一个 CPge:
pageStack.pop()
在SyberOS中,可以通过监听CPage的几个信号来判断状态,它们是:
| 信号 | 描述 |
|---|---|
| Component.onCompleted | 组件加载完成 |
| Component.onDestruction | 组件开始析构 |
| onActiveChanged | 页面激活属性改变 |
| onStatusChanged | 页面状态改变 |
当应用打开时会创建CPage,先后触发CPage中的Component.onCompleted、onStatusChanged、onActiveChanged信号。
当应用关闭时会销毁CPage,触发Component.onDestruction信号。
当应用在前后台之间切换时,会触发onActiveChanged信号,在前台时,CPage的active为true,后台时为false。
随着 CPage 的创建和销毁,它们会从栈中移进移出,在这个过程中,它们经历了下面 4 种可能的状态:
| 状态 | 描述 |
|---|---|
| CPageStatus.Hide | 已经准入后台,不可见状态 |
| CPageStatus.WillShow | 当前 Page 正要转入前台 |
| CPageStatus.Show | 当前 Page 处于前台 |
| CPageStatus.WillHide | 当前 Page 正要转入后台 |
图CPage的生命周期中状态的变化:

启动其他应用是通过 cgui_application.h 中的 qAPP 作为桥梁的,我们可以在 C++中直接使用,也可以将其应用到 qml 中,
m_view = SYBEROS::SyberosGuiCache::qQuickView();
m_view->rootContext()->setContextProperty("globalApp", qApp);
这样我们在 qml 中可以直接使用 globalApp 了。启动其他应用的方式如下:
通过 URL 方式用来启动一个 uiapp
globalApp.openUrl("myapp:entrySecondPage?content=urlTest")
启动一个 service,但这个 service 必须和本应用有相同 sopid,否则不能成功启动该 service
globalApp.runService("MyService", text)
启动一个 uiapp,但这个 uiapp 必须和本应用有相同 sopid,否则不能成功启动该该 uiapp
通过 MIME 方式启动一个 uiapp
globalApp.runDocument("com.mycompany.demo", "MyApp", "share", "*/*", "/home/user/test.txt")
通过 MIME 方式启动一个 uiapp
var fileLsit = [];
fileLsit.push("/home/user/test.bin");
fileLsit.push("/home/user/test.txt");
globalApp.runMultiDocuments("com.mycompany.demo", "MyApp", "share", fileLsit)