当前位置: 首页 > 科技观察

2020征稿-手机图鸿蒙FeatureAbility与AbilitySlice的关系

时间:2023-03-13 02:42:06 科技观察

更多信息请访问:与华为官方共建的鸿蒙技术社区https://harmonyos.51cto.com/#zz当我们在DevEco在Studio中创建鸿蒙工程时,如果选择的设备是手机,选择的模板是EmptyFeatureAbility(Java),如下图,自动生成的HelloWorld工程会包含一个MainAbility和一个MainAbilitySlice。接下来通过两张图帮助大家理解MainAbility和MainAbilitySlice的关系。打开MainAbility,继承自Ability。鸿蒙手机中的任何一个页面都可以用一个Ability(准确的说是FeatureAbility)来表示。页面启动时自动调用回调方法onStart(),方法体中调用setMainRoute()方法路由到MainAbilitySlice。如下所示。打开MainAbilitySlice,它继承自AbilitySlice。鸿蒙手机中的任何一个子页面都可以用一个AbilitySlice来表示。子页面启动时自动调用回调方法onStart,在方法体中调用setUIContent()方法设置子页面的UI内容。UI内容由位于目录resources/base/layout中的布局文件ability_main.xml指定。如下所示。所以在主页面MainAbility中,只设置了路由。页面中包含哪些组件,每个组件长什么样子,都是在子页面MainAbilitySlice中完成的。我们来看这张图:MainAbility相当于一个窗口,MainAbilitySlice相当于一个窗口贴。当两者结合时,就会出现一个带有窗户贴纸的窗户。窗贴中的图片打印在窗贴上。在窗贴上打印图片,相当于调用MainAbilitySlice中的setUIContent()方法,从而将布局文件中的组件和样式应用到MainAbilitySlice中。我们再看这张图:一个窗户可以对应多个窗贴,我们可以从中选择任意一个窗贴贴在窗户上。因此,一个Ability可以对应多个AbilitySlices,我们可以从中选择任意一个AlibitySlice应用到Ability中。在自动生成的HelloWorld项目中,首先将屏幕打印在窗贴上,然后再将窗贴粘贴到窗口上。当然,我们也可以不用窗贴,直接将图片打印在窗上。所以AlibitySlice是可选的,直接在Alibity中调用setUIContent()方法即可。打开MainAbilitySlice,把调用setUIContent()的那行代码剪成MainAbility,替换掉调用setMainRoute()的那行代码。同时删除目录切片,这样MainAbilitySlice也会被删除。此外,在MainAbility中删除导入MainAbilitySlice的行。如下所示。结果和之前完全一样。总结:AbilitySlice是可选的,常见的使用场景有两种:(1)页面有多个布局,需要动态布局页面,每个布局可以对应一个AbilitySlice。(2)页面有多个Tab,需要在多个Tab之间切换。每个Tab可以对应一个AbilitySlice。源代码见附件。欢迎订阅我的专栏【鸿蒙图解】:https://harmonyos.51cto.com/column/27?版权归作者及HarmonyOS技术社区所有。如需转载请注明出处,否则将追究法律责任。想了解更多内容请访问:与华为官方共建鸿蒙科技社区https://harmonyos.51cto.com/#zz