0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一文解析鸿蒙Page Ability的LaunchType

鸿蒙系统HarmonyOS 来源:51CTO 作者:蒙娜丽宁 2021-04-16 14:07 次阅读

在Page Ability的配置信息(config.json文件)中有一个launchType属性,通过模板默认生成的值是standard,这是launchType属性的默认值(可以不设置launchType,这样默认值就是standard)。launchType属性的另外一个可以设置的值是singleton。这两个属性值的区别如下:

standard:在任何情况下,无论Page Ability被显示多少次,都会创建一个新的Page Ability实例;

singleton:如果要显示的Page Ability在栈顶,那么再次显示这个Page Ability时,不会再创建新的Page Ability实例,而是直接使用这个Page Ability实例。如果Page Ability上面有其他的Page Ability,那么首先弹出这些Page Ability,然后再重用这个Page Ability。总之,拥有singleton模式的Page Ability将永远使用唯一的实例;

这里涉及到一个栈的概念,这是HarmonyOS管理Page Ability的模式。HarmonyOS App同时只能显示一个Page Ability,那么哪一个Page Ability才能显示呢?HarmonyOS App会使用一个栈来管理App中所有的Page Ability,只有在栈顶的Page Ability才会显示。如果要想让栈中第2个Page Ability显示,那么栈顶的Page Ability就必须出栈,也就是销毁Page Ability,也就是调用terminateAbility方法要完成的工作。

下面用图示来说明这一过程。图1中每一个矩形区域表示App中当前用于保存Page Ability的栈。1中只有一个Page Ability1,如果让Page Ability2显示,那么Page Ability2必须压栈,Page Ability3显示也需要完成同样的工作。在3的状态中,如果让Page Ability2显示,那么Page Ability3必须出栈,就形成了4中栈的状态。

o4YBAGB5KPWAV-wkAAJQ3qzSM5Y038.png

现在假设Page Ability1的launchType属性值是standard,那么从Page Ability1中启动Page Ability1,如果启动2次,就会再创建两个Page Ability1实例,这时栈的状态如图2所示。

o4YBAGB5KQuAclREAAEGu967NuA679.png

很明显,在栈中有3个Page Ability1实例。

如果Page Ability1的launchType属性值是singleton,那么不管显示多少次Page Ability1,在栈中永远只有1个Page Ability1实例。所以如果想让某一个Page Ability1永远只有一个实例的时候,可以将该Page Ability的launchType属性值设为singleton。

下面通过一个案例来演示standard和singleton的区别。

首先创建一个名为LaunchTypeAbility的Page Ability,并编写下面的代码:

package com.unitymarvel.demo.ability;

import com.unitymarvel.demo.ResourceTable;

import ohos.aafwk.ability.Ability;

import ohos.aafwk.content.Intent;

import ohos.agp.components.Button;

import ohos.agp.components.Component;

import ohos.agp.components.Text;

public class LaunchTypeAbility extends Ability {

private static int count = 0; // 计数器

@Override

public void onStart(Intent intent) {

super.onStart(intent);

super.setUIContent(ResourceTable.Layout_launch_type_layout);

count++;

Text text = (Text)findComponentById(ResourceTable.Id_text);

if(text != null) {

text.setText(String.valueOf(count));

}

Button buttonStartAbility = (Button)findComponentById(ResourceTable.Id_button_start_ability);

if(buttonStartAbility != null) {

buttonStartAbility.setClickedListener(new Component.ClickedListener() {

@Override

public void onClick(Component component) {

Intent intent = new Intent();

intent.setAction(“action.harmonyos.demo.ability.testlaunchtype”);

// 显示另外一个Page Ability

startAbility(intent);

}

});

}

}

}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.

复制在config.json文件中配置LaunchTypeAbility,代码如下:

{

“skills”: [

{

“actions”: [

“action.harmonyos.demo.ability.launchtype”

}

],

orientation”: “landscape”,

“formEnabled”: false,

“name”: “com.unitymarvel.demo.ability.LaunchTypeAbility”,

“icon”: “$media:icon”,

“label”: “Page Ability的启动类型”,

“type”: “page”,

“launchType”: “standard”

}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.

复制这里将LaunchTypeAbility的launchType属性值设为standard。

然后再创建另外一个名为TestLaunchTypeAbility的Page Ability,代码如下:

package com.unitymarvel.demo.ability;

import com.unitymarvel.demo.ResourceTable;

import ohos.aafwk.ability.Ability;

import ohos.aafwk.content.Intent;

import ohos.agp.components.Button;

import ohos.agp.components.Component;

import ohos.agp.components.Text;

public class TestLaunchTypeAbility extends Ability {

@Override

public void onStart(Intent intent) {

super.onStart(intent);

super.setUIContent(ResourceTable.Layout_launch_type_layout);

Button buttonStartAbility =

(Button)findComponentById(ResourceTable.Id_button_start_ability);

if(buttonStartAbility != null) {

buttonStartAbility.setClickedListener(new Component.ClickedListener() {

@Override

public void onClick(Component component) {

Intent intent = new Intent();

intent.setAction(“action.harmonyos.demo.ability.launchtype”);

// 显示LaunchTypeAbility

startAbility(intent);

}

});

}

}

}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.

复制本例包含两个Page Ability:LaunchTypeAbility和TestLaunchTypeAbility。目前这两个Page Ability的launchType属性值都是standard。这两个Page Ability的关系是LaunchTypeAbility显示TestLaunchTypeAbility,然后TestLaunchTypeAbility再显示LaunchTypeAbility,如图3所示。

pIYBAGB5KSeAYAx6AAJlit8ZUS4932.png

在LaunchTypeAbility类中有一个静态变量count,如果每次显示LaunchTypeAbility时都创建一个新的实例,那么count会不断加1,例如,如果显示3次LaunchTypeAbility,应该看到如图4所示的窗口。

o4YBAGB5KTqAIgN9AAE92ls7RU4576.png

如果将LaunchTypeAbility的launchType属性值改成singleton,那么不管显示多少次LaunchTypeAbility,计数器count的值永远是1,如图5所示。因为LaunchTypeAbility在创建一个实例后,就不会再创建新的LaunchTypeAbility实例了,所以onStart方法自然就不会再次调用了。

pIYBAGB5KUuAa7UHAAD99De-3o8231.png

编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 鸿蒙系统
    +关注

    关注

    183

    文章

    2605

    浏览量

    65250
收藏 人收藏

    评论

    相关推荐

    鸿蒙Ability开发-Stage模型下Ability的创建和使用

    创建AbilityPage页面 创建两个Ability:EntryAbility,DetailsAbility,其中EntryAbility是由工程默认创建的,这里我们只讲如何创建
    发表于 01-08 15:34

    【全球首套鸿蒙2.0教程】鸿蒙(HarmonyOS)2.0入门与实战【李宁】 - 2.Ability Page

    鸿蒙HarmonyOS行业芯事经验分享
    蒙娜丽宁
    发布于 :2022年02月25日 15:53:33

    【全球首套鸿蒙2.0教程】鸿蒙(HarmonyOS)2.0入门与实战【李宁】 - 3.Page Ability

    鸿蒙HarmonyOS行业芯事经验分享
    蒙娜丽宁
    发布于 :2022年02月25日 15:54:41

    HarmonyOS应用开发-Ability

    是FA唯支持的模板,用于提供与用户交互的能力。Page实例可以包含组相关页面,每个页面用个AbilitySlice实例表示。PA支
    发表于 09-24 15:39

    跟阿斌起学鸿蒙(2): Ability vs App?

    在进步实践之前,需要先弄明白个概念:Ability。不知道你有没有注意到,使用鸿蒙开发工具DevEco Studio创建项目时,我们选择创建的是
    发表于 11-30 20:56

    跟阿斌起学鸿蒙(2): Ability vs App?

    在进步实践之前,需要先弄明白个概念:Ability。不知道你有没有注意到,使用鸿蒙开发工具DevEco Studio创建项目时,我们选择创建的是
    发表于 12-02 16:55

    鸿蒙 Ability 讲解(页面生命周期、后台服务、数据访问)

    Ability) (音译:非ture 阿B了D),中文意思是功能能力,它支持Page Ability 页面能力用于提供与用户交互的能力。Pag
    发表于 12-17 10:37

    图解鸿蒙Feature Ability和AbilitySlice的关系

    当我们在DevEco Studio中创建鸿蒙项目时,如果选择的设备是手机,并且选择的模板是Empty Feature Ability(Java),如下图所示,那么自动生成的Hello World
    发表于 12-21 15:03

    图解鸿蒙Page AbilityLaunchType

    Page Ability的配置信息(config.json文件)中有launchType属性,通过模板默认生成的值是standard,这是la
    发表于 12-24 09:09

    #2020征文-手机#【鸿蒙基地】鸿蒙跨设备启动窗口:Page Ability

    HarmonyOS的核心特性(或称为卖点)之就是软总线技术,而Page Ability的跨设备迁移是软总线的个具体技术实现。所谓跨设备迁移Pag
    发表于 12-31 11:56

    #2020征文-手机#【鸿蒙基地】鸿蒙跨设备启动窗口:Page Ability

    HarmonyOS的核心特性(或称为卖点)之就是软总线技术,而Page Ability的跨设备迁移是软总线的个具体技术实现。所谓跨设备迁移Pag
    发表于 01-25 14:13

    个小白曾经踩过的坑,鸿蒙

    AbilitySlice的名称当做AbilityName,在函数withAbilityName中只能填写Ability的名称,至于要具体启动那个AbilitySlice可以有两种方法来控制,种是通过传参在
    发表于 09-04 21:42

    HarmonyOS应用开发-Page Ability启动Service Ability

    Page Ablity响应交互,从而调用Service Ability鸿蒙开发中最常用的交互方式,在Page Ablity使用startAbility(intent)启动Servic
    发表于 11-03 10:32

    鸿蒙开发如何修改默认执行自定义Ability,然后根据需要进入MainAbility呢?

    各位大佬,目前遇到个问题,就是在进行鸿蒙开发的时候,系统会默认先执行MainAbility,那么要如何修改默认执行自定义Ability,然后根据需要进入MainAbility呢???
    发表于 03-17 15:46

    鸿蒙开发第一课-各类名词介绍以及基础功能实现

    前提 本文基于鸿蒙sdk version6进行编写。 名词介绍 开发鸿蒙应用最重要使用ability能力,Ability其实和Spring MVC相像。
    的头像 发表于 01-25 14:32 118次阅读
    <b class='flag-5'>鸿蒙</b>开发第一课-各类名词介绍以及基础功能实现