PageAbility的生命周期及Page内Slice间的导航

PageAbility的整个生命周期,概括如下图所示:

 onStart()

当系统首次创建Page实例时,触发该回调。对于一个Page实例,该回调在其生命周期过程中仅触发一次,Page在该逻辑后将进入INACTIVE状态。开发者必须重写该方法,并在此配置默认展示的AbilitySlice。

onActive()

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

onBackground()

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

onForeground()

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

onStop()

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

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

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

下面我们通过代码输出日志来演示其周期过程,为了方便输出日志,我们需要封装一下HarminyOS的日志输出方式,代码如下:


public class LogUtil {
    private static final String TAG_LOG = "LogUtil";

    private static final HiLogLabel LABEL_LOG = new HiLogLabel(0, 0, LogUtil.TAG_LOG);

    private static final String LOG_FORMAT = "%{public}s: %{public}s";

    private LogUtil() {
    }


    public static void info(String tag, String msg) {
        HiLog.info(LABEL_LOG, LOG_FORMAT, tag, msg);
    }

    public static void error(String tag,String msg){
        HiLog.error(LABEL_LOG,LOG_FORMAT,tag,msg);
    }
}

生命周期:

应用运行后

 开始回调onStart, onActive两个方法

我们把应用退回后台,运行如下:

 回调onInactive与onBackground方法。

我们再打开应用,其运行如下:

 会回调OnForeground,onActive方法

我们退出应用,其运行如下:

会回调onActive,onInactive,onBackground,onStop方法。

至此,通过日志我们应该可以对PageAbility的生命周期会有一个比较直观的了解。

下面我们来了解一下AbilitySlice间的导航,通俗的讲就是Page内Slice之间的相互跳转,也可以说是相互切换。

这个比较简单,直接上代码:

  @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_main);
        //通过ID找到xml中的button控件
        Button button = (Button) findComponentById(ResourceTable.Id_main_button);
        //设置点击监听事件
        button.setClickedListener(new Component.ClickedListener() {
            @Override
            public void onClick(Component component) {
                //点击跳转
                present(new SecondSlice(),new Intent());
            }
        });

    }

 这是最简单的一个跳转,通过present()方法实现。

我们在跳转的时候,要是希望从导航目标AbilitySlice返回时,能够获得其返回结果,则应当使用presentForResult()实现导航。

系统将回调onResult()来接收和处理返回结果,开发者需要重写该方法。返回结果由导航目标AbilitySlice在其生命周期内通过setResult()进行设置。

代码如下:

 @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_main);
        //通过ID找到xml中的button控件
        Button button = (Button) findComponentById(ResourceTable.Id_main_button);
        //设置点击监听事件
        button.setClickedListener(new Component.ClickedListener() {
            @Override
            public void onClick(Component component) {
                //点击跳转
                presentForResult(new SecondSlice(),new Intent(),110);
            }
        });

    }

我们在代码中看到,我们往SecondSlice传了110,然会我们在返回到当前Ability时,可以在

onResult方法中收到110这个值。

具体看代码:

 @Override
    protected void onResult(int requestCode, Intent resultIntent) {
        LogUtil.info("onResult requestCode",requestCode+"");
    }

我们看一下输出日志:

 这就是Page内AbilitySlice间的导航。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在JavaScript中,可以使用slice()方法来返回一个指定索引范围内的数组的浅拷贝。在循环中使用slice()方法可以实现对数组的切片操作。 在循环中使用slice()方法可以有多种用途。首先,可以通过使用slice()方法来遍历数组的一部分元素。例如,如果我们有一个长度为10的数组arr,我们可以使用slice()方法来遍历数组的前五个元素: ``` var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; for (var i = 0; i < 5; i++) { var slicedElement = arr.slice(i, i + 1); // 对每个被切割的元素执行某些操作 console.log(slicedElement); } ``` 这将输出数组的前五个元素: ``` [1] [2] [3] [4] [5] ``` 此外,在迭代过程中使用slice()方法,还可以使用其中的一部分数组来进行其他操作,例如数组拷贝、过滤、修改等。以下是在循环中使用slice()方法进行数组拷贝和过滤的示例: ``` var originalArr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; var copiedArr = []; for (var i = 0; i < originalArr.length; i++) { var slicedArr = originalArr.slice(i, i + 1); copiedArr.push(slicedArr[0]); } console.log(copiedArr); // 输出:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] var filteredArr = []; for (var i = 0; i < originalArr.length; i++) { var slicedArr = originalArr.slice(i, i + 1); if (slicedArr[0] % 2 === 0) { filteredArr.push(slicedArr[0]); } } console.log(filteredArr); // 输出:[2, 4, 6, 8, 10] ``` 因此,使用slice()方法可以在JavaScript循环中对数组进行切片操作,以便进行元素遍历、拷贝、过滤等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搬砖摸鱼专业户

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值