更多信息请访问:与华为官方共建的鸿蒙技术社区https://harmonyos.51cto.com/#zzonPageAbility's配置信息(config.json文件)有一个launchType属性。模板生成的默认值为standard,也就是launchType属性的默认值(不能设置launchType,所以默认值为standard)。可以为launchType属性设置的另一个值是单例。这两个属性值的区别如下:standard:在任何情况下,无论PageAbility显示多少次,都会创建一个新的PageAbility实例;单例:如果要显示的PageAbility在栈顶,则再次显示PageAbility,不会创建新的PageAbility实例,而是直接使用这个PageAbility实例。如果PageAbility之上还有其他PageAbilities,则先弹出这些PageAbilities,再复用这个PageAbility。总之,单例模式的PageAbility永远使用唯一实例;这里涉及到栈的概念,也就是HarmonyOS管理PageAbility的模式。HarmonyOSApp同时只能显示一个页面能力,那么可以显示哪个页面能力?HarmonyOSApp会使用一个栈来管理App中所有的PageAbility,只会显示栈顶的PageAbility。如果要显示栈中的第二个PageAbility,则必须将栈顶的PageAbility出栈,即销毁PageAbility,这是调用终止能力方法。下图说明了这个过程。图1中的每个矩形区域代表当前用于保存App中PageAbility的堆栈。1中只有一个PageAbility1,如果要显示PageAbility2,那么PageAbility2必须压栈,PageAbility3显示也需要完成同样的工作。3的状态下,如果显示PageAbility2,那么PageAbility3必须出栈,形成4中出栈的状态。现在假设PageAbility1的launchType属性值为standard,则从PageAbility1开始PageAbility1,如果启动两次,会创建两个PageAbility1实例,此时栈的状态如图2所示,显然栈中有3个PageAbility1实例。如果PageAbility1的launchType属性值为singleton,无论PageAbility1显示多少次,栈中永远只有一个PageAbility1实例。所以如果想让某个PageAbility1永远只有一个实例,可以将PageAbility的launchType属性值设置为singleton。下面用一个案例来说明standard和singleton的区别。首先创建一个名为LaunchTypeAbility的PageAbility,并编写下面的代码:packagecom.unitymarvel.demo.ability;importcom.unitymarvel.demo.ResourceTable;importohos.aafwk.ability.Ability;importohos.aafwk.content.Intent;importohos.agp.components.Button;importohos.agp.components.Component;importohos.agp.components.Text;publicclassLaunchTypeAbilityextendsAbility{privatestaticintcount=0;//计算器@OverridepublicvoidonStart(Intentintent){super.onStart(intent);super.setUIContent(ResourceTable.Layout_launch_type_layout);count++;Texttext=(Text)findComponentById(ResourceTable.Id_text);if(text!=null){text.setText(String.valueOf(count));}ButtonbuttonStartAbility=(Button)findComponentById(ResourceTable.Id_button_start_ability);if(buttonStartAbility!=null){buttonStartAbility.setClickedListener(newComponent.ClickedListener(){@OverridepublicvoidonClick(Componentcomponent){Intentintent=newIntent();intent.setAction("action.harmonyos.demo.ability.testlaunchtype");//显示另外一个PageAbilitystartAbility(intent);}});}}}在config.json文件中配置LaunchTypeAbility,代码如下:{"skills":[{"actions":["action.harmonyos.demo.ability.launchtype"]}],"orientation":"landscape","formEnabled":false,"name":"com.unitymarvel.demo.ability.LaunchTypeAbility","icon":"$media:icon","label":"PageAbilitylaunchType","type":"page","launchType":"standard"}这里设置LaunchTypeAbility的launchType属性值为standard然后再创建一个名为TestLaunchTypeAbility的PageAbility,代码如下:packagecom.unitymarvel.demo.ability;importcom.unitymarvel.demo.ResourceTable;importohos.aafwk.ability.Ability;importohos.aafwk.content.Intent;importohos.agp。components.Button;importohos.agp.components.Component;importohos.agp.components.Text;publicclassTestLaunchTypeAbilityextendsAbility{@OverridepublicvoidonStart(Intentintent){super.onStart(intent);super.setUIContent(ResourceTable.Layout_launch_type_layout);Abuttonbutton=findComponentById(ResourceTable.Id_button_start_ability);if(buttonStartAbility!=null){buttonStartAbility.setClickedListener(newComponent.ClickedListener(){@OverridepublicvoidonClick(Componentcomponent){Intentintent=newIntent();intent.setAction("action.harmonyos.demo.ability.launchtype");//显示LaunchTypeAbilitystartAbility(intent);}});}}}这个例子包含两个PageAbilities:LaunchTypeAbility和TestLaunchTypeAbility。目前这两个PageAbilities的launchType属性值都是标准的。这两个PageAbilities的关系是LaunchTypeAbility显示TestLaunchTypeAbility,然后TestLaunchTypeAbility显示LaunchTypeAbility,如图3所示。LaunchTypeAbility类中有一个静态变量count。如果每次显示LaunchTypeAbility时都创建一个新实例,则计数将继续增加1。例如,如果LaunchTypeAbility显示3次,则应看到图4所示的窗口。如果将LaunchTypeAbility的launchType属性值改为singleton,无论显示多少次LaunchTypeAbility,计数器count的值始终为1,如图5所示。因为LaunchTypeAbility在创建实例后不会创建新的LaunchTypeAbility实例,那么onStart方法自然不会再被调用了。欢迎来到李宁老师的【鸿蒙基地】专栏:https://harmonyos.51cto.com/column/17李宁老师的课程主页:https://edu.51cto.com/lecturer/974126.html想知道更多请访问:与华为官方共建的鸿蒙技术社区https://harmonyos.51cto.com/#zz【编辑推荐】2021年更适合web开发的7种编程语言为什么用Eclipse而不用VSCode香吗?权威数据来了,中国到底有多少程序员?10个实用工具网站你收藏了吗?2021年可能有五种编程语言前景更好
