在上面的一篇文章中,我们介绍了怎样使用URL disptacher。在这篇文章中,我们来通过一个范例更进一步来了解怎样实现它。

1)创建一个具有URL dispatcher的应用

我们首先打开我们的SDK,然后创建一个最主要的QML template应用。

我们把该应用叫做“MyApp”。

我们首先在“MyApp”的根文件夹加入一个文件叫做“MyApp.url-dispatcher”文件,这里面的内容例如以下:


[
{
"protocol": "launchmyapp"
}
]

这种定义使得不论什么在Qt.openUrlExternally()中具有以“launchmyapp:///”开头的调用,就能够打开该应用。

比方:


Qt.openUrlExternally("launchmyapp:///123");

同一时候,我们改动我们的manifest.json文件例如以下:


{
"architecture": "all",
"description": "description of MyApp",
"framework": "ubuntu-sdk-14.10-dev2",
"hooks": {
"MyApp": {
"apparmor": "MyApp.apparmor",
"desktop": "MyApp.desktop",
"urls": "MyApp.url-dispatcher"
}
},
"maintainer": "XiaoGuo, Liu <xiaoguo.liu@canonical.com>",
"name": "com.ubuntu.developer.unknown.myapp",
"title": "MyApp",
"version": "0.1"
}

注意这里的“urls”项。到这里,我们基本上就行让我们的应用可以被其他的应用调用了。为了可以得到调用应用传来的參数。我们也同一时候改动我们的desktop文件例如以下:


[Desktop Entry]
Name=MyApp
Exec=qmlscene $@ main.qml -- %u
Icon=MyApp.png
Terminal=false
Type=Application
X-Ubuntu-Touch=true

注意这里的"-- %u",这是增加的部分。

为了可以在程序中显示得到的URL信息,我们对程序做了例如以下的改动:



import QtQuick 2.0
import Ubuntu.Components 1.1 /*!
\brief MainView with a Label and Button elements.
*/ MainView {
id:root // objectName for functional testing purposes (autopilot-qt5)
objectName: "mainView" // Note! applicationName needs to match the "name" field of the click manifest
applicationName: "com.ubuntu.developer.unknown.myapp" Component.onCompleted: {
mylabel.text = "aaaa";
console.log( "arg length: " + myarg.arguments.length ); if ( myarg.defaultArgument === undefined) {
mylabel.text = "undefined";
} else {
mylabel.text = "args: " + myarg.defaultArgument.at(0);
} console.log("argument: " + myarg.defaultArgument.at(0));
console.log("")
} Arguments {
id: myarg
defaultArgument.help: "Expects URL of the media to play."
defaultArgument.valueNames: ["URL"]
} /*
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(50)
height: units.gu(75) Page {
title: i18n.tr("MyApp") Column {
spacing: units.gu(1)
anchors {
margins: units.gu(2)
fill: parent
} Row {
spacing: units.gu(2) Label {
id: mylabel
objectName: "label" text: i18n.tr("Received parameters: ")
} Label {
id: label
objectName: "label" text: i18n.tr("")
} Connections {
target: UriHandler
onOpened: {
// root.applicationName = "good"
mylabel.text = "dddddd"; var para = "";
for (var i = 0; i < uris.length; ++i) {
// application.parseArgument(uris[i])
console.log( uris[i] );
para += uris[i];
} label.text = para;
}
}
}
}
} }

注意这里的“UriHandler”部分,当应用在执行时,url dispatcher被调用时。该部分代码会被执行。

当应用没有执行时,我们通过传人的參数从而得到输入的參数值:


    Arguments {
id: myarg
defaultArgument.help: "Expects URL of the media to play."
defaultArgument.valueNames: ["URL"]
}

整个的代码在例如以下的地址能够找到:


https://code.launchpad.net/~liu-xiao-guo/debiantrial/myapp


2)创建调用应用


这个应用事实上非常easy。

我们直接创建一个主要的QML template应用。同一时候改动我们的main.qml例如以下:


import QtQuick 2.0
import Ubuntu.Components 1.1 /*!
\brief MainView with a Label and Button elements.
*/ MainView {
// objectName for functional testing purposes (autopilot-qt5)
objectName: "mainView" // Note! applicationName needs to match the "name" field of the click manifest
applicationName: "com.ubuntu.developer.unknown.launchmyapp" /*
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(100)
height: units.gu(75) Page {
title: i18n.tr("LaunchMyApp") Column {
spacing: units.gu(1)
anchors {
margins: units.gu(2)
fill: parent
} Button {
objectName: "button"
width: parent.width text: i18n.tr("Launch MyApp") onClicked: {
Qt.openUrlExternally("launchmyapp:///123");
}
} Button {
objectName: "button"
width: parent.width text: i18n.tr("Open MyApp") onClicked: {
Qt.openUrlExternally("appid://com.ubuntu.developer.unknown.myapp/MyApp/current-user-version");
}
}
}
}
}

这里我们使用了两种方法来调用我们的“MyApp”。第一种是通过:


 Qt.openUrlExternally("launchmyapp:///123");

这样的方法的优点是能够传人我们须要的參数,并解析,从而对于不同的參数能够得到不同的响应。


第二种方式是通过:

Qt.openUrlExternally("appid://com.ubuntu.developer.unknown.myapp/MyApp/current-user-version");

这样的方法不能解析不论什么的參数,它能够把应用启动起来。我们能够通过例如以下的方法得到应用的一些信息:



执行我们的应用:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVWJ1bnR1VG91Y2g=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="200" height="300" alt="">


我们按下第一个button,假设“MyApp”没有执行时,会显演示样例如以下的在左边的画面。

假设“MyApp”在已经执行的情况下,能够看到例如以下的右边的画面:


   

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVWJ1bnR1VG91Y2g=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="200" height="300" alt="">


假设,我们点击应用以下的button的话,能够看到例如以下的画面:



整个项目的源代码在例如以下的地址能够找到:


bzr branch lp:~liu-xiao-guo/debiantrial/launchmyapp





使用URL dispatcher的范例的更多相关文章

  1. Django 源码小剖: URL 调度器(URL dispatcher)

    在刚开始接触 django 的时候, 我们尝试着从各种入门文档中创建一个自己的 django 项目, 需要在 mysite.urls.py 中配置 URL. 这是 django url 匹配处理机制的 ...

  2. URL 调度器(URL dispatcher)

    URL 调度器(URL dispatcher) 在刚开始接触 django 的时候, 我们尝试着从各种入门文档中创建一个自己的 django 项目, 需要在 mysite.urls.py 中配置 UR ...

  3. Django 源码小剖: 更高效的 URL 调度器(URL dispatcher)

    效率问题 django 内部的 url 调度机制说白了就是给一张有关匹配信息的表, 这张表中有着 url -> action 的映射, 当请求到来的时候, 一个一个(遍历)去匹配. 中, 则调用 ...

  4. django notes 二:URL dispatcher

    一般在 settings.py 中会有一个  ROOT_URLCONF ,请求到来时 django 会从 ROOT_URLCONF 指向的文件中查找  urlpatterns 变量配置的路由. url ...

  5. 怎样在QML应用中调用系统设置中的页面来设置我们的系统

    我们在QML应用中有时须要调用系统设置(system settings)来完毕我们的一些设置.比方,我们在使用GPS来定位时,可能GPS并没有打开,假设在我们的应用中直接打开系统中的GPS设置页面,这 ...

  6. Django的url使用方法

    利用Django开发站点.能够设计出很优美的url规则,假设url的匹配规则(包括正則表達式)组织得比較好,view的结构就会比較清晰.比較easy维护. 最简单的形式 from django.con ...

  7. Django学习之十一:真正理解Django的路由分发和反解url原理

    目录 URL Dispatcher 简介 模式概念 对比URLPattern 与 URLResolver (多态的体现) 构建子路由几种方式 反解url算法逻辑 URL Dispatcher 简介 d ...

  8. Django中URL的解析和反查

    add by zhj: 如果想用reverse(namespace1:namespace2:...:namespaceN:name)反查url(注意:用reverse('polls:index')方法 ...

  9. Django 2.0 URL

    Overview¶ A view is a “type” of Web page in your Django application that generally serves a specific ...

随机推荐

  1. cf21D Traveling Graph

    You are given undirected weighted graph. Find the length of the shortest cycle which starts from the ...

  2. AOP面向方面(切面)编程

    1.引言 软件开发的目标是要对世界的部分元素或者信息流建立模型,实现软件系统的工程需要将系统分解成可以创建和管理的模块.于是出现了以系统模块化特性的面向对象程序设计技术.模块化的面向对象编程极度极地提 ...

  3. 频繁项挖掘算法Apriori和FGrowth

    一:背景介绍 最近在公司用spark的平台做了一个购物车的推荐,用到的算法主要是FGrowth算法,它是Apriori算法的升级版,算法的主要目的是找出频繁进行一起购买的商品.本文主要介绍两个算法的背 ...

  4. Bootstrap开启模态框后对数据处理(标记模态框的开启与关闭状态)

    JS用全局变量标记状态,方法中动态修改全局变量以标记状态是一个重要思想. 需求:组合条件查询数据,查询完之后填充到模态框中,开启模态框,模态框中有组合条件查询,此时查询只需要更新模态框表格数据不需要开 ...

  5. php——验证身份证是否合法的函数

    function is_idcard( $id ){ $id = strtoupper($id); $regx = "/(^\d{15}$)|(^\d{17}([0-9]|X)$)/&quo ...

  6. python和python-dev

    问:python-dev是什么?为什么安装了python后有时还要安装python-dev? 答: linux发行版通常会把类库的头文件和相关的pkg-config分拆成一个单独的xxx-dev(el ...

  7. codevs3249搭积木

    3249 搭积木  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description Petya有一个A×B×C的长方体积木,积 ...

  8. 算法笔记字符串处理问题H:编排字符串(2064)

    题目描述 请输入字符串,最多输入4 个字符串,要求后输入的字符串排在前面,例如 输入:EricZ 输出:1=EricZ 输入:David 输出:1=David 2=EricZ 输入:Peter 输出: ...

  9. JS标签获取另一个页面传过来的href值

    a href=b.html?id=楼主>B页面</a>b.html中的获取函数:function getParam(){C1=window.location.href.split(& ...

  10. android 图片浏览器滑动切换图片

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools= ...