Cascades框架可以让我们在BlackBerry应用平台上创建UI组件变得更容易和更快速,它基于QT4.8,QT4.8是用c++开发的应用框架。
所有的Cascades应用都有类似的生命周期,一共包含三个状态:foreground、background、stopped.
foreground:应用是可见的,并且占满整个屏幕,如用户正在使用你的应用时。
background:
(1)应用是可见的,并且处于active frame形式(当用户从屏幕底边向上滑动,此时应用会展现成active frame形式),如图:

(2)应用是不可见的,但有run_when_backgrounded(运行在后台)权限
stopped:应用既不可见又没有run_when_backgrounded权限,此时为了提高性能,处理器是不会分配时间给应用的,应用停止运行。
什么时候以及怎么给应用添加run_when_backgrounded权限呢?
当你的应用不需要用户主动输入来进行交互时,此时不需要让用户看到应用的界面,你可以监听某一个事件,并在某一操作或者某一时间提醒用户,此时你就可以让应用拥有run_when_backgrounded权限,有点类似于Android中的Service,只需要在项目的bar-descriptor.xml文件中指定:

<permission>run_when_backgrounded</permission>

当应用拥有run_when_backgrounded权限和没有该权限时,生命周期有点不一样,下面分别来了解一下:
1. 拥有run_when_backgrounded权限时,看下面的图:

此时app是没有stopped状态的,因为应用一直是运行着的。即使应用运行在后台变成了不可见,它也能执行一些操作。
2. 没有run_when_backgrounded权限时,看图:

此时当用户使用其他程序或者屏幕背光关闭时,应用就变成了stopped状态;但当用户又使用该应用时,比如回到active frame列表时,应用的生命周期会从stopped变成background,用户继续从active frame点击进入应用时,会从background变成foreground状态;如果用户不是从active frame列表里重新进入应用,而是重新从桌面程序图标进入,那么应用会首先到active frame,然后再进入程序。
可以根据下面几个函数,跟踪应用的生命状态。
fullscreen():当应用处于foreground状态时会发送该信号
thumbnail():当应用成为active frame形式,并处于background状态时会发送该信号
invisible():当应用变得不可见时会发送此信号,无论是否有run_when_backgrounded权限

下面通过一个简单的demo来跟踪一下生命周期的各个状态。
首先创建一个空的Cascades Project,名称:BB10AppLife,在BB10AppLife.hpp文件中添加对应的三个slots,源码:

#ifndef BB10AppLife_HPP_
#define BB10AppLife_HPP_

#include <QObject>

namespace bb { namespace cascades { class Application; }}

class BB10AppLife : public QObject
{
    Q_OBJECT
public:
    BB10AppLife(bb::cascades::Application *app);
    virtual ~BB10AppLife() {}

public Q_SLOTS:
    void onFullScreen();

    void onThumbnail();

    void onInvisible();
};

#endif /* BB10AppLife_HPP_ */

BB10AppLife.cpp添加实现代码:

// Default empty project template
#include "BB10AppLife.hpp"

#include <bb/cascades/Application>
#include <bb/cascades/QmlDocument>
#include <bb/cascades/AbstractPane>

using namespace bb::cascades;

BB10AppLife::BB10AppLife(bb::cascades::Application *app)
: QObject(app)
{
    // create scene document from main.qml asset
    // set parent to created document to ensure it exists for the whole application lifetime
    QmlDocument *qml = QmlDocument::create("asset:///main.qml").parent(this);

    // create root object for the UI
    AbstractPane *root = qml->createRootObject<AbstractPane>();
    // set created root object as a scene

    bool result = connect(app, SIGNAL(fullscreen()), this, SLOT(onFullScreen()));
    qDebug() << "result1:" << result;

    result = connect(app, SIGNAL(thumbnail()), this, SLOT(onThumbnail()));
    qDebug() << "result2:" << result;

    result = connect(app, SIGNAL(invisible()), this, SLOT(onInvisible()));
    qDebug() << "result3:" << result;

    app->setScene(root);
}

void BB10AppLife::onFullScreen() {
	qDebug() << "fullscreen";
}

void BB10AppLife::onThumbnail() {
	qDebug() << "thumbnail";
}

void BB10AppLife::onInvisible() {
	qDebug() << "invisible";
}

SIGNAL(信号)和SLOT(插槽)是Cascades应用中对象间通信的机制,这里就不多说了。主要来了解下怎么实现在c++中打印log,这里使用了qDebug,格式跟标准c++程序中的输出cout一样,你可以通过slogger2 logs查看打印的信息,也可以看到在qml中打印的信息,在qml中使用console.log(“alexzhou”)打印日志,这样就给调试程序带来了很大的方便。下面来实现在QNX Momentics IDE中查看打印的日志信息:
(1) 打开 Window >> Open Perspective >> QNX System Information
(2) 右击连接的设备,如usb,选择Launch SSH session,在命令行输入slog2info -w | grep “9000”,然后回车,就可以看到打印的日志了。

现在我们来运行程序,看看对应的效果图和Terminal打印的消息。
(1) 首次进入应用

打印的日志为fullscreen:

(2)切换到active frame形式

打印的日志为thumbnail:

注意:这时应用还是可见的,如果active frame列表有很多程序,一直往下拖直到我们的应用看不到为止:

现在看看打印的日志为invisible:

(3)切换到桌面

打印的日志为invisible:

BlackBerry10 学习Signals和Slots

在Cascades框架中,使用Signals(信号)和slots(信号槽)机制来实现对象间通讯,如类A中封装了登录的相关操作,有一个signal为loginResult(bool result)函数,你...

阅读全文

BlackBerry10 TextField自动获取焦点并弹出输入法

今天来实现这样一个效果:进入注册页面时,文本输入框自动获取焦点并弹出输入法键盘。顺便吐槽一下,这个功能本身来说是很容易实现的,但是由于BB10资料太少...

阅读全文

BlackBerry10 让Cascades应用运行到手机上

上一篇博客我们实现了一个简单的Cascades Demo,并成功运行到模拟器中,但是在模拟器上运行还是有点不爽,今天要把他跑在手机上。BB10程序安装到真机调试还是...

阅读全文

欢迎留言