本节主要完成 SyberOS 应用程序进行详细的描述,提供给 SyberOS 应用程序开发人员提供指导。
以创建app
项目为例,将会看到如下结构:
├── app.pro 项目主配置文件
├── syberos.pri 如果有的话,其内容为应用与SyberOS系统有关的配置
├── META-INF 程序签名及证书文件夹
│ └── DEBUG.KEY 创建后默认的证书,手机上需要替换为元心发布的证书
│ └── SyberOSSdkDebug.pem 元心应用的调试证书
├── MyApp 默认uiapp
│ ├── MyApp.pro .pro配置文件文件
│ ├── qml qml目录
│ │ └── main.qml 默认qml入口文件
│ ├── res
│ │ └── MyApp.png 默认logo文件
│ ├── res.qrc SyberOS资源配置文件
│ └── src C++目录
│ ├── main.cpp 主程序文件
│ ├── MyApp_Workspace.cpp 系统框架功能支持文件
│ └── MyApp_Workspace.h 系统框架功能支持头文件
├── sopconfig.xml SyberOS安装运行的配置文件(核心)
└── tests 单元测试目录
└── tests.pro 单元测试工程文件
SyberOS 的应用程序由一些组件组成,并使用应用程序的 sopconfig.xml 绑定到一起,应用程序的 sopconfig.xml 描述了每一个组件和它们之间的交互方式。以下几个组件提供了 SyberOS 应用程序的基本模块结构。
应用程序的表示层。应用程序的每一个图形都是通过一个或多个 uiapp 的扩展实现的,uiapp 使用 QML 语言来布局和显示信息,以及响应用户动作。
应用程序中不可见的工作者。service 组件在运行时没有图形界面,它可以更新数据源,被可以用来处理一些运行长时间的任务或者不需要用户交互的任务。
仅能在 uiapp 中使用,用来描述 uiapp 可以接受哪些 url,实现 uiapp 间的相互调用。
仅能在 uiapp 中使用,用来定义一个 uiapp 可以支持的文档类型。
<?xml version="1.0" encoding="utf-8"?>
<sopconfig>
<uses-permission />
<uses-sdk />
<application>
<uiapp>
<url>
<scheme />
</url>
<doctype>
<name />
<action />
<mime-type />
<extension />
</doctype>
<multidoc>
<action />
</multidoc>
<receiver>
<event />
</receiver>
</uiapp>
<service>
<receiver>
<event />
</receiver>
<doctype>
<name />
<mime-type />
<extension />
</doctype>
</service>
<backup />
</application>
</sopconfig>
sopconfig 是 sopconfig.xml 的根元素
属性名 | 描述 |
---|---|
xmlns:syberos | xmlns:syberos : 命名空间。对于 v1 版本, 必须为"http://schemas.syberos.com/sop/res/syberos/v1" |
syberos:sopid | Syber OS Package ID,包名称。可以包含大写字母、小写字母、数字、下划线、点,必须以字母开头,总长度不超过 128 字符。此名称必须唯一,为了避免冲突,开发者要使用自己拥有的域名的倒序方式。例如,元心公司发布的应用,包名称都将是以 com.syberos. 开头的字符串。对于三方开发者,应用审核时将拒绝以 com.syberos、 syberos 和 com.example. 开头的包名称。对于没有自己域名的开发者,可以使用 dev.syberos.+邮件地址倒序(将“@”改为“.”)作为前缀,如开发者 john@example.com可以使用 dev.syberos.com.example.john. 作为前缀。 |
syberos:versionCode | 版本号。必须是一个正整数。此数值作为内部版本比较用。数值较大的将被认为是更高的版本。这个数值将不会在任何界面展示给用户,用户看到的是 syberos:versionName。 |
syberos:versionName | 版本名称。是一个不超过 32 字符的字符串。不作为版本比较依据,版本比较使用syberos:versionCode。 |
<sopconfig xmlns:syberos="http://schemas.syberos.com/sop/res/syberos/v1"
syberos:sopid="string"
syberos:versionCode="integer"
syberos:versionName="string">
</sopconfig>
声明应用的各个组件,如图形应用、服务等
属性名 | 描述 |
---|---|
syberos:debuggable | 是否允许调试,布尔值。当为true时,允许调试。当为false时,不允许调试(即使设备设置中调试开关是打开的)。默认值为 false |
syberos:descriotion | 此应用的描述 。比 syberos:name 更详细。 |
syberos:icon | 包含路径应用图标的文件名。路径为 对sopconfig.xml 的相对路径。 |
syberos:name | 应用的名称 。在桌面、应用管理中用户可见。 |
<application syberos:debuggable="true"
syberos:description="string"
syberos:icon="app.png"
syberos:name="MYAPP" >
</application>
仅能在 uiapp 中使用,用来描述 uiapp 可以接受哪些 url。当系统需要处理声明的 scheme 时,将调用此 uiapp
属性名 | 描述 |
---|---|
syberos:scheme | 描述 uiapp 可以接受哪些 url |
<url>
<scheme>string</scheme>
</url>
uses-permission 列出了应用所需要的权限。这些权限将在安装时和用户查看已安装应用时显示给用户,用户可以选择将其中的部分或全部授权给应用。对于此处没有列出的权限和用户没有授权的权限,应用在使用权限时将遇到错误。如果需要申请多个权限,需要写多个并列的 uses-permission 元素
属性名 | 描述 |
---|---|
syberos:name | 权限的名称字符串 |
syberos.permission.ACCESS_ALARM | 允许应用申请 ALARM |
syberos.permission.ACCESS_APP_PERMISSION | 允许应用修改应用的权限,不能修改 mdm 配置的权限 |
syberos.permission.ACCESS_BLACKLIST | 允许应用更新系统黑名单 |
syberos.permission.ACCESS_BLUETOOTH | 允许应用通过蓝牙进行通讯 |
syberos.permission.ACCESS_CONTACTS | 允许访问联系人信息 |
syberos.permission.ACCESS_CAMERA | 请求访问使用照相设备,后台不能拍照 |
syberos.permission.ACCESS_DATA_NETWORK | 允许应用使用数据连接 |
syberos.permission.ACCESS_FLASHLIGHT | 访问闪光灯 |
syberos.permission.ACCESS_NOTIFICATION | 允许应用发送 Notification |
syberos.permission.ACCESS_PHONE | 允许应用接听、拨打电话 |
syberos.permission.ACCESS_USERAUTH | 认证服务相关权限 |
syberos.permission.ACCESS_SIM | 允许应用访问 SIM 卡信息、修改 pin 码 |
syberos.permission.ACCESS_SMS | 允许程序发送短信、读系统短信 |
syberos.permission.ACCESS_STORAGE | 允许应用访问内置 SDCard 和外置 SDcard |
syberos.permission.ACCESS_WAKELOCK | 防止系统休眠 |
syberos.permission.ACCESS_WIFI | 允许应用通过 WIFI 访问网络 |
syberos.permission.ADMIN_BLUETOOTH | 允许应用发现和配对蓝牙设备 |
syberos.permission.ADMIN_DATA_NETWORK | 允许应用配置数据连接 |
syberos.permission.ADMIN_PACKAGES | 允许安装、卸载应用 |
syberos.permission.ADMIN_TIME | 允许应用设置系统时间 |
syberos.permission.ADMIN_VPN | 允许应用配置 VPN |
syberos.permission.ADMIN_WIFI | 允许应用配置 WIFI 网络、配置 AP 热点 |
syberos.permission.CAPTURE_SCREEN | 截屏 |
syberos.permission.CLEAR_APP_DATA | 允许删除应用的数据 |
syberos.permission.DEVICE_DATAFORMAT | 数据完全删除 |
syberos.permission.DEVICE_OTA | 允许应用发送 OTA 申请 |
syberos.permission.DEVICE_RECOVERY | 允许调用恢复出厂设置 |
syberos.permission.DEVICE_SHUTDOWN | 请求关闭、重启设备 |
syberos.permission.MDM | 允许数据中心中修改应用的配置项,允许在权限中心中设置应用的权限,设备全局的权限 |
syberos.permission.READ_CONTACT | 允许应用读联系人数据,例如元信通 |
syberos.permission.READ_IMEI | 允许应用访问设备的 IMEI 号 |
syberos.permission.READ_FINE_LOCATION | 允许应用访问精确位置(如 GPS) |
syberos.permission.READ_NETWORK_STATE | 允许应用访问网络状态信息 |
syberos.permission.RECORD | 允许程序录制音频,后台也能录音 |
syberos.permission.VIBRATE | 允许访问振动设备 |
应用对平台的兼容性
属性名 | 描述 |
---|---|
syberos:minSdkVersion | 此应用所能运行的最小版本号,正整数。默认值 1 |
syberos:targetSdkVersion | 此应用所运行的目标版本号,正整数。默认取 syberos:minSdkVersion |
<uses-sdk syberos:minSdkVersion="integer" syberos:targetSdkVersion="integer" />
应用程序的表示层。应用程序的每一个图形都是通过一个或多个 uiapp 的扩展实现的,uiapp 使用 QML 语言来布局和显示信息,以及响应用户动作。
属性名 | 描述 |
---|---|
syberos:id | 用来标识此 uiapp 。开发者应保证在同一 sopconfig.xml 中,此值唯一。字符串中不能含有"/",长度不能超过128字节。 |
syberos:exec | uiapp 对应的可执行文件位置 。使用相对 sopconfig.xml 的相对路径。 |
syberos:splash | uiapp 对应的 splash 文件位置 。使用相对 sopconfig.xml 的相对路径。 |
syberos:icon | 包含路径应用图标的文件名 。路径为对sopconfig.xml 的相对路径。缺省值为 applicaton 中的 syberos:icon。 |
syberos:launcher | 是否在桌面显示图标,布尔值 。当为 true 时,在桌面显示此uiapp 图标。当为false时,桌面不显示图标。默认值为 true 。 |
syberos:name | 应用的名称 。在桌面、应用管理中用户可见。 |
<uiapp syberos:id="string"
syberos:exec="string"
syberos:splash="string"
syberos:icon="bin/myapp"
syberos:launcher="true"
syberos:name="string" >
</uiapp>
仅能在 uiapp 中使用,用来定义一个 uiapp 可以支持的文档类型。当系统需要处理声明的文档类型时,将调用此 uiapp 打开文档
属性名 | 描述 |
---|---|
syberos:id | 用来标识 doctype,将作为参数传给 doctype 处理函数 |
syberos:name | 此文档处理程序在用户界面上显示的名称 |
syberos:action | 应用可以执行的操作,有效的值为 view/edit/share(TODO:需要扩展) |
syberos:mime-type | 文件格式。一个doctype 中可以有多个mime-type。特别的,*匹配所有mime-type。 |
syberos:extension | 文件扩展名。不需要以“.”开头,不区分大小写。一个doctype中可以有多个extension。特别的,*匹配所有扩展名 |
<doctype syberos:id="jpeg viewer">
<syberos:name>JPEG Viewer by SyberOS</syberos:name>
<syberos:action>view</syberos:action>
<syberos:mime-type>image/jpeg</syberos:mime-type>
<syberos:extension>jpg</syberos:extension>
<syberos:extension>jpeg</syberos:extension>
</doctype>
仅能在 uiapp 中使用,用来定义一个 uiapp 可以支持同时打开多个文档。当系统需要处理多个文档时,将调用此 uiapp 打开多个文档
属性名 | 描述 |
---|---|
syberos:id | 用来标识 multidoc,将作为参数传给 multidoc 处理函数。开发者应保证在同一uiapp 中,此值唯一。 |
syberos:action | 应用可以执行的操作,有效的值share |
<multidoc syberos:id="email sender">
<syberos:action>share</syberos:action>
</multidoc>
应用程序中不可见的工作者。service 组件在运行时没有图形界面,它可以更新数据源,被可以用来处理一些运行长时间的任务或者不需要用户交互的任务。
属性名 | 描述 |
---|---|
syberos:id | 用来标识此 service,开发者应保证在同一 sopconfig.xml 中,此值唯一 |
syberos:exec | uiapp 对应的可执行文件位置 |
<service syberos:id="string"
syberos:exec="bin/app-service" >
</service>
receiver 中包含任意个 event,当系统有制定的事件时,此 service 被执行,且被通知有对应事件
属性名 | 描述 |
---|---|
event | 系统的事件名称。系统支持的事件见SyberOS系统事件。对于系统不支持的事件或者用户没有授权的事件,对应的 receiver 将被忽略。 |
// 应用开机自启
<receiver>
<event>BOOT_COMPLETE</event>
</receiver>
声明支持系统备份恢复功能。如果不声明 backup,则表示不支持系统备份恢复功能。backup 标签在 application 中不能超过 1 个
属性名 | 描述 |
---|---|
syberos:exec | 支持系统备份恢复接口的可执行文件位置 |
<backup syberos:exec="string" />
SyberOS 应用程序的资源包括 QML 界面资源,图片资源以及字符串资源等。
QML 界面资源用来描述界面详细内容,包括哪些控件以及之间的布局。
SyberOS 应用程序的国际化实现方法如下:
lupdate_only {
SOURCES +=
}
TRANSLATIONS += \
xxx.zh_CN.ts \
xxx.zh_HK.ts
qm.path = $$INSTALL_DIR/qm
qm.files = *.qm
INSTALLS += qm
其次,使用 lupdate 命令执行 lupdate xxx.pro更新翻译文件
再次,使用 linguist 命令执行 linguist xxx.ts 更新翻译内容
最后,使用:lrelease 命令执行 lrelease xxx.pro发布翻译文件
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()
随着 CPage 的创建和销毁,它们会从栈中移进移出,在这个过程中,它们经历了下面 4 种可能的状态:
CPageStatus.Hide :已经准入后台,不可见状态
CPageStatus.WillShow 当前 Page 正要转入前台
CPageStatus.Show 当前 Page 处于前台
CPageStatus.WillHide 当前 Page 正要转入后台
启动其他应用是通过 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)