鸿蒙中级之 AbilitySlice 深入使用(HarmonyOS鸿蒙开发基础知识)

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();
  }
 
 

下图显示了能力切片的完整生命周期。一个能力切片在任何时候都只能处于一种状态。并非所有州都支持直接过渡。

image.png

注意: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


从零开始入门学习HarmonyOS鸿蒙2.0开发

猜你喜欢

转载自blog.csdn.net/iCloudEnd/article/details/108734793