文章目录
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