HarmonyOS PageAbility 学习

PageAbility基本概念

如果你是Android开发者,就很好理解这个概念,PageAbility类似于Android中的Activity用于显示UI的基本组件。至于AbilitySlice,据我的理解,类似于Fragment,一个PageAbility可以包含多个AbilitySlice.

虽然一个Page可以包含多个AbilitySlice,但是Page进入前台时界面默认只展示一个AbilitySlice。默认展示的AbilitySlice是通过**setMainRoute()方法来指定的。如果需要更改默认展示的AbilitySlice,可以通过addActionRoute()**方法为此AbilitySlice配置一条路由规则

PageAbility与AbilitySlice关系如图所示:

PageAbility生命周期

Page生命周期回调

与Activity一样,PageAbility也有生命周期,如下所示:

  • onStart()

    类似于Activity的onCreate().

    只在创建页面时触发一次,Page在该逻辑后将进入INACTIVE状态。开发者必须重写该方法,并在此配置默认展示的AbilitySlice。

        @Override
        public void onStart(Intent intent) {
            super.onStart(intent);
            super.setMainRoute(FooSlice.class.getName());
        }
    
  • onActive()

    类似于Activity的onResume().

    Page会在进入INACTIVE状态后来到前台,然后系统调用此回调。Page在此之后进入ACTIVE状态,该状态是应用与用户交互的状态。Page将保持在此状态,除非某类事件发生导致Page失去焦点,比如用户点击返回键或导航到其他Page。当此类事件发生时,会触发Page回到INACTIVE状态,系统将调用onInactive()回调。此后,Page可能重新回到ACTIVE状态,系统将再次调用onActive()回调。因此,开发者通常需要成对实现onActive()和onInactive(),并在onActive()中获取在onInactive()中被释放的资源

  • onInactive()

    类似于Activity的onPause().

    当Page失去焦点时,系统将调用此回调,此后Page进入INACTIVE状态。开发者可以在此回调中实现Page失去焦点时应表现的恰当行为

  • onBackground()

    类似于Activity的onStop().

    如果Page不再对用户可见,系统将调用此回调通知开发者用户进行相应的资源释放,此后Page进入BACKGROUND状态。开发者应该在此回调中释放Page不可见时无用的资源,或在此回调中执行较为耗时的状态保存操作。

  • onForeground()

    类似于Activity的onRestart().

    处于BACKGROUND状态的Page仍然驻留在内存中,当重新回到前台时(比如用户重新导航到此Page),系统将先调用onForeground()回调通知开发者,而后Page的生命周期状态回到INACTIVE状态。开发者应当在此回调中重新申请在onBackground()中释放的资源,最后Page的生命周期状态进一步回到ACTIVE状态,系统将通过onActive()回调通知开发者用户

  • onStop()

    类似于Activity的onFinish().

    系统将要销毁Page时,将会触发此回调函数,通知用户进行系统资源的释放。销毁Page的可能原因包括以下几个方面:

    • 用户通过系统管理能力关闭指定Page,例如使用任务管理器关闭Page。
    • 用户行为触发Page的terminateAbility()方法调用,例如使用应用的退出功能。
    • 配置变更导致系统暂时销毁Page并重建。
    • 系统出于资源管理目的,自动触发对处于BACKGROUND状态Page的销毁
AbilitySlice生命周期

AbilitySlice作为Page的组成单元,其生命周期是依托于其所属Page生命周期的。AbilitySlice和Page具有相同的生命周期状态和同名的回调,当Page生命周期发生变化时,它的AbilitySlice也会发生相同的生命周期变化。此外,AbilitySlice还具有独立于Page的生命周期变化,这发生在同一Page中的AbilitySlice之间导航时,此时Page的生命周期状态不会改变。

AbilitySlice生命周期回调与Page的相应回调类似,因此不再赘述。由于AbilitySlice承载具体的页面,开发者必须重写AbilitySlice的onStart()回调,并在此方法中通过setUIContent()方法设置页面,如下所示:

    @Override
    protected void onStart(Intent intent) {
        super.onStart(intent);

        setUIContent(ResourceTable.Layout_main_layout);
    }

PageAbility跳转

同一PageAbility内AbilitySlice普通跳转
  		//相同page,普通跳转
        jumpToSecondSlice.setClickedListener((component) -> {
            HiLog.error(LABEL_LOG, "jumpToSecondClick2");
            Intent data = new Intent();
            data.setParam("data", "我是MainSlice");
            present(new MainAbilitySecondSlice(), data);
        });
同一PageAbility内AbilitySlice带回传值跳转
  		//相同page,回传值
        jumpToSecondSlick.setClickedListener((component) -> {
            HiLog.error(LABEL_LOG, "jumpToSecondClick");
            Intent data = new Intent();
            data.setParam("data", "我是MainSlice");
            presentForResult(new MainAbilitySecondSlice(), data, 1);
        });

  @Override
    protected void onResult(int requestCode, Intent resultIntent) {
        super.onResult(requestCode, resultIntent);
        if (requestCode == 1) {
            HiLog.error(LABEL_LOG, "结果:" + resultIntent.getStringParam("data"));
        }
    }

//另一个Slice回传
 //回传值调用
        jumpToFirstSlick.setClickedListener((component) -> {
            HiLog.error(label, "jumpToSecondClick");
            Intent data = new Intent();
            data.setParam("data", "我是SecondSlice");
            setResult(data);
            terminate();
        });
不同PageAbility内AbilitySlice普通跳转
  		//不同page,普通跳转
        jumpToOtherFirst.setClickedListener((component) -> {
            Intent data = new Intent();
            data.setParam("data", "第一个slice");
            Operation operation = new Intent.OperationBuilder()
                    .withDeviceId("")
                    .withAction("action.firstability.first")
                    .build();
            data.setOperation(operation);
            startAbility(data);

        });

我们看下action的配置

{
        "orientation": "portrait",
        "name": "com.example.hmlearning.ui.FirstAbility",
        "icon": "$media:icon",
        "description": "$string:firstability_description",
        "label": "$string:app_name",
        "type": "page",
        "launchType": "standard",
        "skills": [
          {
            "actions": [
              "action.firstability.first",
              "action.firstability.second"
            ]
          }
        ]
      },

FirstAbility添加action导航

public class FirstAbility extends Ability {
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setMainRoute(FirstAbilitySlice.class.getName());
        addActionRoute("action.firstability.first", FirstAbilitySlice.class.getName());
        addActionRoute("action.firstability.second", FirstAbilitySecondSlice.class.getName());

    }

}
不同PageAbility内AbilitySlice回传值跳转
  		//不同page,回传值跳转
        jumpToOtherSecond.setClickedListener((component) -> {
            Intent data = new Intent();
            data.setParam("data", "第二个slice");

            Operation operation = new Intent.OperationBuilder()
                    .withDeviceId("")
                    .withAction("action.firstability.second")
                    .build();
            data.setOperation(operation);
            startAbilityForResult(data, 2);

        });

//获取回传结果
  @Override
    protected void onAbilityResult(int requestCode, int resultCode, Intent resultData) {
        super.onAbilityResult(requestCode, resultCode, resultData);
        if (requestCode == 2 && resultCode == 100) {
            HiLog.error(LABEL_LOG, "结果:" + resultData.getStringParam("data"));
        }
    }


//action对应的slice回传
  findComponentById(ResourceTable.Id_backTo).setClickedListener((component) -> {
            Intent data = new Intent();
            data.setParam("data", "我是FirstAbilitySecondSlice");
            getAbility().setResult(100,data);
            terminate();
        });

结语

Harmony OS 持续学起,相关demo在这个地址 https://github.com/luncang/hmlearning

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值