HarmonyOS基础之Fraction用法介绍
前言
Fraction字面意思为分数、极小一部分,在Ability或者AbilitySlice中它实际也是页面的一部分,不能单独使用。Fraction的生命周期状态取决于它的容器,如果容器被销毁,其中的所有部分也将被销毁。我们可以使用Fraction定义各种布局,以丰富应用程序的用户界面。下面就向大家介绍一下Fraction的具体用法以及其生命周期。
Fraction使用
首先想要使用Fraction,我们必须让Ability继承FractionAbility。
- public class FractionAbility extends Ability {
- public FractionAbility() {
- throw new RuntimeException("Stub!");
- }
- public FractionManager getFractionManager() {
- throw new RuntimeException("Stub!");
- }
- ...
- }
为什么一定需要继承FractionAbility,通过FractionAbility源码我们可以看出其内部提供了getFractionManager()方法,该方法返回的FractionManager是管理Fraction的生命周期的关键方法。
那么下面就让我们来简单使用一下Fraction。
首先我们创建一个layout,为Fraction的布局文件fraction_first.xml。
- <?xml version="1.0" encoding="utf-8"?>
- <DependentLayout
- xmlns:ohos="http://schemas.huawei.com/res/ohos"
- ohos:height="match_parent"
- ohos:width="match_parent">
- <Text
- ohos:text_size="25fp"
- ohos:center_in_parent="true"
- ohos:text="First Fraction"
- ohos:height="match_content"
- ohos:width="match_content"/>
- </DependentLayout>
布局文件创建完成后我们再来新建一个类TestFraction继承Fraction。
- public class TestFraction extends Fraction {
- @Override
- protected Component onComponentAttached(LayoutScatter scatter, ComponentContainer container, Intent intent) {
- Component component = scatter.parse(ResourceTable.Layout_fraction_first,
- container, false);
- return component;
- }
- }
就这样一个简单的Fraction就创建好了,接下来就是将它添加到Ability中,布局文件ability_test_fraction.xml。
- <?xml version="1.0" encoding="utf-8"?>
- <DirectionalLayout
- xmlns:ohos="http://schemas.huawei.com/res/ohos"
- ohos:height="match_parent"
- ohos:width="match_parent"
- ohos:alignment="center"
- ohos:orientation="vertical">
- <StackLayout
- ohos:id="$+id:fraction_container"
- ohos:height="match_parent"
- ohos:width="match_parent"
- ohos:bottom_margin="45vp">
- </StackLayout>
- </DirectionalLayout>
TestFractionAbility继承FractionAbility。
- public class TestFractionAbility extends FractionAbility {
- @Override
- public void onStart(Intent intent) {
- super.onStart(intent);
- super.setUIContent(ResourceTable.Layout_ability_test_fraction);
- FractionManager fractionManager = getFractionManager();
- fractionManager.startFractionScheduler().add(ResourceTable.Id_fraction_container, new TestFraction()).submit();
- }
- }
就这样,TestFraction就成功的被添加到了Ability中,ability_test_fraction.xml中的fraction_container就是放置TestFraction的容器,在摸机器运行效果如下:
FractionManager方法探索
我们已经学习了Fraction的简单用法,下面再来研究下对Fraction管理的关键类FractionManager。
- public class FractionManager {
- FractionManager() {
- throw new RuntimeException("Stub!");
- }
- public FractionScheduler startFractionScheduler() {
- throw new RuntimeException("Stub!");
- }
- public void popFromStack() {
- throw new RuntimeException("Stub!");
- }
- public void popFromStack(String tag, int flags) {
- throw new RuntimeException("Stub!");
- }
- public Optional<Fraction> getFractionByTag(String tag) {
- throw new RuntimeException("Stub!");
- }
- }
这里有startFractionScheduler(),popFromStack(),popFromStack(String tag, int flags),getFractionByTag(String tag)四个方法。
getFractionByTag(String tag)方法很明显就是通过tag获取已添加的Fraction,那么popFromStack()方法的作用是什么呢?
为了研究该方法的用途,我们先来看下看下startFractionScheduler(),该方法返回了FractionScheduler对象Fraction调度器,字面理解应该就是
Fraction的管理器,下面来看下FractionScheduler提供了哪些方法管理Fraction。
- public abstract class FractionScheduler {
- public FractionScheduler() {
- throw new RuntimeException("Stub!");
- }
- public abstract FractionScheduler add(int var1, Fraction var2);
- public abstract FractionScheduler add(int var1, Fraction var2, String var3);
- public abstract FractionScheduler replace(int var1, Fraction var2);
- public abstract FractionScheduler remove(Fraction var1);
- public abstract FractionScheduler hide(Fraction var1);
- public abstract FractionScheduler show(Fraction var1);
- public abstract int submit();
- public abstract FractionScheduler pushIntoStack(String var1);
- }
这里通过代码我们可以很直观的看出FractionScheduler是个抽象类,里面提供了对Fraction的添加,替换,移除,展示的方法,并且最终通过submit()方法提交操作。
其中有个很特别的方法pushIntoStack(String var1),这个方法具体是做什么的呢,结合上文我们发现它是与popFromStack()方法配合使用的,一个添加一个移除。
下面我们就写个简单的示例演示下该方法的使用。
- fractionManager = getFractionManager();
- fractionManager.startFractionScheduler().add(ResourceTable.Id_fraction_container, new TestFraction()).pushIntoStack("1").submit();
- fractionManager.startFractionScheduler().add(ResourceTable.Id_fraction_container, new FirstFraction()).pushIntoStack("2").submit();
- fractionManager.startFractionScheduler().add(ResourceTable.Id_fraction_container, new SecondFraction()).pushIntoStack("3").submit();
- fun1.setClickedListener(new Component.ClickedListener() {
- @Override
- public void onClick(Component component) {
- System.out.println("fractionManager.popFromStack()");
- fractionManager.popFromStack();
- }
- });
- fun2.setClickedListener(new Component.ClickedListener() {
- @Override
- public void onClick(Component component) {
- System.out.println("fractionManager.popFromStack("",1)");
- fractionManager.popFromStack("2",1);
- }
- });
往同一个容器中添加三个Fraction,并且都使用pushIntoStack(“”)方法将Fraction添加到堆栈中,先来看popFromStack()调用效果。
可以看出SecondFraction,FirstFraction,TestFraction依次被移除
重新运行项目,我们在调用popFromStack(String tag, int flags)方法,将tag设置为"2",FirstFraction查看运行效果。
SecondFraction,FirstFraction同时被移除了
通过实践可以看出popFromStack()每次调用会移除堆栈顶部的Fraction,popFromStack(String tag, int flags)则会移除tag以及其上层所有Fraction。
了解了具体作用,在今后我们的开发场景中可以根据需求对Fraction进行管理。
Fraction的生命周期
研究了Fraction的具体用法,下面我们就来探索一下Fraction在Ability中的生命周期情况。
Fraction生命周期主要涉及到八个方法,分别是onComponentAttached、onStart、onActive、onInactive、onBackground、onForeground、onStop、onComponentDetach。
我们在每个方法中添加日志运行程序查看生命周期具体情况。
启动Fraction
![HarmonyOS基础之Fraction用法介绍-鸿蒙HarmonyOS技术社区](https://s5.51cto.com/oss/202109/15/ad4e9e9bad85d4cb9558364ac4485485.jpg)
依次调用onComponentAttached、onStart、onActive方法
按下home进入后台
![HarmonyOS基础之Fraction用法介绍-鸿蒙HarmonyOS技术社区](https://s3.51cto.com/oss/202109/15/e65e9497da8e79df4b8be4bc5c9b4065.jpg)
依次调用onInactive、onBackground方法
返回前台
![HarmonyOS基础之Fraction用法介绍-鸿蒙HarmonyOS技术社区](https://s3.51cto.com/oss/202109/15/ad6c6995011a1519f3d55ddf80c63562.jpg)
依次调用onForeground、onActive方法
退出应用
![HarmonyOS基础之Fraction用法介绍-鸿蒙HarmonyOS技术社区](https://s2.51cto.com/oss/202109/15/940cddf9f329921bb3fe315abdf422dc.jpg)
依次调用onInactive、onBackground、onStop、onComponentDetach方法
总结:
通过本次学习,我们了解了Fraction的基本用法,Fraction所涉及到的关键类以及其中开放的关键方法,最后还探索了Fraction的生命周期,当然 Fraction 也有缺陷 在实际开发中,我们可能需要让Fraction嵌套Fraction,目前鸿蒙还不支持Fraction嵌套Fraction。所以在使用过程中我们要避免Fraction嵌套走弯路。
相关文章
- 金融服务领域的大数据:即时分析
- 影响大数据、机器学习和人工智能未来发展的8个因素
- 从0开始构建一个属于你自己的PHP框架
- 如何将Hadoop集成到工作流程中?这6个优秀实践必看
- SEO公司使用大数据优化其模型的5种方法
- 关于Web Workers你需要了解的七件事
- 深入理解HTTPS原理、过程与实践
- 增强分析:数据和分析的未来
- PHP协程实现过程详解
- AI专家:大数据知识图谱——实战经验总结
- 关于PHP的错误机制总结
- 利用数据分析量化协同过滤算法的两大常见难题
- 怎么做大数据工作流调度系统?大厂架构师一语点破!
- 2019大数据处理必备的十大工具,从Linux到架构师必修
- OpenCV中的KMeans算法介绍与应用
- 教大家如果搭建一套phpstorm+wamp+xdebug调试PHP的环境
- CentOS下三种PHP拓展安装方法
- Go语言HTTP Server源码分析
- Go语言HTTP Server源码分析
- 2017年4月编程语言排行榜:Hack首次进入前五十