AbilitySlice
作为使用Page模板的Ability的基本单位 ,AbilitySlice为服务逻辑和UI显示提供了带有载体的功能。
一个能力可以有多个能力切片。您必须重写Ability#onStart(Intent)方法以指定默认的能力切片。通过使用Ability#setMainRoute(String)指定此默认路由。
您可以继承AbilitySlice类来实现自己的能力切片,并在onStart(ohos.aafwk.content.Intent)方法中设置其UI 。可以使用setUIContent(ohos.agp.components.ComponentContainer)或setUIContent(int)来设置UI 。通常,在功能切片的整个生命周期中,只需设置一次UI。示例代码:
public class MyAbilitySlice extends AbilitySlice {
protected void onStart(Intent intent) {
super.onStart(intent);
// setup UI content from a layout resource
setUIContent(R.res.layout);
}
}
前面的代码仅定义运行时的入口路由。要将能力的功能暴露给其他能力,必须在配置文件config.json中注册操作字段。示例代码:
{
"module":{
...
"abilities":[
{
...
"description": "Main ability of hiworld",
"name": ".MainAbility",
"label": "main ability",
"icon": "main-ability.png",
"type": "page",
"visible": true,
"orientation": "unspecified",
"launch-mode": "standard",
"skills"[
{
"actions":[
"action.pay",
"action.scan"
]
}
]
...
}
]
...
}
}
以上述方式注册受支持的动作后,其他能力可以通过指定动作使用您的能力,并直接打开相应的能力片。示例代码:
Intent intent = new Intent();
Operation operation = new Intent.OperationBuilder()
.withAction("action.pay")
.withDeviceId("")
.withBundleName("xxx")
.withAbilityName("yyy")
.build();
intent.setOperation(operation);
startAbility(intent);
AbilitySlice生命周期
能力切片的生命周期与承载它的能力有关。功能片具有与宿主功能相同的生命周期状态和生命周期回调方法。异能的生命周期状态一旦更改,其异能切片就会发生相同的变化,并调用相同的回调方法。功能切片也可以具有其独立的生命周期更改。在切换能力中的能力切片期间会发生此独立更改。但是,这样的切换不会影响宿主能力的生命周期。
能力切片具有以下四个生命周期状态:
- 初始:能力切片已加载到内存中,但未运行。它是所有能力切片的初始状态。
- 不活跃:能力切片已加载并执行,但不是交互式的。通常,在能力切片变为ACTIVE或Background之前是中间状态。在此状态下功能切片的UI可能可见,但无法接收输入事件。
- 活动:能力切片可见且具有交互性。认为能力切片具有焦点。
- 背景:能力切片是不可见的。如果宿主能力也处于后台,则在内存不足的情况下会破坏能力和能力切片。
与功能类似,功能切片提供以下生命周期回调方法。您可以覆盖它们。
public class MainAbilitySlice extends AbilitySlice {
protected void onStart(Intent intent);
protected void onActive();
protected void onInactive();
protected void onForeground(Intent intent);
protected void onBackground();
protected void onStop();
}
下图显示了能力切片的完整生命周期。一个能力切片在任何时候都只能处于一种状态。并非所有州都支持直接过渡。
注意:onStart(ohos.aafwk.content.Intent)方法在整个生命周期中只能调用一次。
下面提供了每种生命周期回调方法的含义以及一些最佳实践建议。
- onStart(ohos.aafwk.content.Intent):必须为UI初始化设置实现此方法,例如 setUIContent(int)。在整个生命周期中只能调用一次此方法。调用方可以使用Intent类携带一些自定义的键值,并通过intent提供的方法获取这些参数。
- onActive():当功能片返回活动状态时,将调用此方法。回调之后,UI是交互式的。
- onInactive():当能力切片被完全或部分覆盖时,将调用此方法。回调后,UI不交互式。
- onForeground(ohos.aafwk.content.Intent)()}:当功能片返回到前景时,将调用此方法。可以在回调中恢复或初始化应用程序的交互逻辑。如果在能力切片返回到前景时需要指定新的自定义参数,则可以传输新的意图参数。
- onBackground():当能力切片进入背景时,将调用此方法。在这种状态下,您不能长时间执行后台任务,因为系统可能会随时停止后台程序的运行。
- onStop():调用此方法以销毁能力切片。您可以使用此方法回收资源。
在能力切片之间切换
您可以使用present(ohos.aafwk.ability.AbilitySlice,ohos.aafwk.content.Intent)方法呈现新的能力切片,并使用Intent传输自定义参数。示例代码:
Button button = new Button(this);
button.setClickedListener(listener -> {
AbilitySlice targetSlice = new MyAbilitySlice();
Intent intent = new Intent();
intent.setParam("value", 10);
present(targetSlice, intent);
});
注意:一个Ability中最多可以同时显示1024个 AbilitySlice。如果尝试显示第1025个异能切片,系统将强制使该异能崩溃。为了避免这种情况,如果需要同时显示大量能力切片,则必须改进代码。
未经授权禁止转载
更多技术交流请加入QQ群
群名称:harmonyos鸿蒙技术交流
群 号:856567895