『牛角书』Ability的学习与使用 HarmonyOS|入门学习 精华

发布于 2022-2-26 23:01
浏览
1收藏

Ability概述

官方文档解释:

Ability是应用所具备能力的抽象,也是应用程序的重要组成部分。一个应用可以具备多种能力(即可以包含多个Ability),HarmonyOS支持应用以Ability为单位进行部署。Ability可以分为FA(Feature Ability)和PA(Particle Ability)两种类型,每种类型为开发者提供了不同的模板,以便实现不同的业务功能。

简单的来说,一个项目的一个功能模块就可称之为一个ability. 如图:

如在上图的电商平台项目中,一个商品模块,购物车模块和用户中心模块都可以当作一个ability

『牛角书』Ability的学习与使用 HarmonyOS|入门学习-开源基础软件社区

PageAbility

Ability的最主要承载体展现形式即PageAbility,具体内容由AbilitySlice提供

『牛角书』Ability的学习与使用 HarmonyOS|入门学习-开源基础软件社区

AbilitySlice的创建

  • 在slice包中创建—个类继承ohos.aafwk .ability. Abilityslice类
import ohos.aafwk.ability.AbilitySlice;

public class MainAbilitySlice2 extends AbilitySlice {

}
  • 在resources/ base / layout目录下创建布局文件
<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:alignment="center"
    ohos:orientation="vertical">

    <Text
        ohos:id="$+id:text_helloworld"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:background_element="$graphic:background_ability_main"
        ohos:layout_alignment="horizontal_center"
        ohos:text="$string:mainability_HelloWorld"
        ohos:text_size="40vp"
        />

</DirectionalLayout>
  • 在创建的Abilityslice类中重写onStart方法,调用setuIContent方法加载布局文件通过ResourceTable加载resouces目录下的资源
public class MainAbilitySlice extends AbilitySlice {
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_main);
    }
}

PageAbility生命周期

  • onStart()

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

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

『牛角书』Ability的学习与使用 HarmonyOS|入门学习-开源基础软件社区
『牛角书』Ability的学习与使用 HarmonyOS|入门学习-开源基础软件社区

  • onActive()

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

  • onInactive()

    当Page失去焦点时,系统将调用此回调,此后Page进入INACTIVE状态。开发者可以在此回调中实现Page失去焦点时应表现的恰当行为。如出现弹窗弹出另一个sliceability界面,使其失去焦点.

『牛角书』Ability的学习与使用 HarmonyOS|入门学习-开源基础软件社区『牛角书』Ability的学习与使用 HarmonyOS|入门学习-开源基础软件社区

  • 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间导航

PageAbility即相当于一个窗口,里面具体内容再由SliceAbility提供, 一个模块(ability)中有且只有一个PageAbility,而PageAbility中则含有多个SliceAbility,并且不同的SliceAbility之间可以切换. 如下图 产品列表 和 产品详情 两个不同SliceAbility之间的切换

『牛角书』Ability的学习与使用 HarmonyOS|入门学习-开源基础软件社区『牛角书』Ability的学习与使用 HarmonyOS|入门学习-开源基础软件社区

同一Page内导航

  • 在MainAbilitySlice中添加按钮,并监听按钮的点击事件

『牛角书』Ability的学习与使用 HarmonyOS|入门学习-开源基础软件社区

  • 在MainAbilityslice中监听按钮的点击事件,导航到secondAbilitySlice
Button btn1 = (Button) this.findComponentById(ResourceTable.Id_btn1);


Component.clickedListener listener = new Component.clickedListener(){
	@verride
	public void onclick(Component component) {
	}
};

btn1.setclickedListener(listener);
//跳转代码  SecondAbilityslice为新创建的跳转的页面
this.present(new SecondAbilityslice( ) , new Intent());

PageAbility-Slice间的传值

使用Intent对象实现slice间的传值

如图,由商品列表跳转到商品详情页面时,需用到跳转传值的操作

『牛角书』Ability的学习与使用 HarmonyOS|入门学习-开源基础软件社区

  • MainAbilitySlice

创建新的Intent 通过 setParam方法设置需要传递的值

public class MainAbilityslice extends AbilitySlice {
	@override
	public void onStart( Intent intent) {
		super.onStart(intent) ;
		super.setUIContent ( ResourceTable.Layout_ability_main);
    	//获取id=btn1的按钮组件
		Button btn1 = ( Button) this.findComponentById(ResourceTable.Id_btn1) ;
    	//设置按钮事件监听
		btn1.setClckedListener ( component -> {
		//在跳转之前的slice将需要传递的数据设置到Intent对象中
         Intent intent1 = new Intent( );
		intent1.setParam( " productid ”, "101" );
		this.present( new SecondAbilityslice( ) , intent1 ) ;
         });
	}
)

『牛角书』Ability的学习与使用 HarmonyOS|入门学习-开源基础软件社区

  • SecondAbilitySlice
public class SecondAbilityslice extends Abilityslice {
    
	@Override
    protected void onStart( Intent intent) {
        super.onStart(intent);
        this.setuUIContent(ResourceTable.Layout_ability_second ) ;
        //在跳转后的slice的onstart方法中,从intent对象中获取数据
        if(intent !=null ){
            IntentParams params = intent.getParams( );
            string productId = ( String) params. getParam( " productId" );
            //获取到id=text1的文本组件
            Text text = (Text) findComponentById(ResourceTable.Id_text1 );//将获取到的商品ID设置到text文本组件
            text.setText( productId);
		}
  	}     
}

不同一Page内导航

应用不仅可以实现slice之间的导航,对于一个应用而言可以包含多个PageAbility,我们也可以实现在不同的PageAbility之间的导航
private void navigateToAnotherPage(Component component) {
    
	Intent intent = new Intent();
	Operation operation = new Intent.OperationBuilder()
		.withDeviceId("")[/没备ID,如果时当前设备则填写""
         .withBundleName("com.qfedu.myapplication.demo2")//应用的bundleName
         .withAbilityName( " com.qfedu.myapplication.demo2.ShopcartAbility")//启动的Ability的路径
         .build();
	//intent对象,包含Operation和IParameters
    //parameters用于传递数据
	//Operation表示Ability或者Slice目标
                          
    intent.set0peration(operation) ;
                          
	//启动另外一个PageAbility:在一个鸿蒙应用中
	// 1.可以启动当前设备的当前应用中的其他PageAbility
	//2.也可以启动当前设计的其他应用中的PageAbility : Demo3UserAbility
	//3.还可以启动其他设备的应用中的PageAbility: wuzhengyi Demo4TestAbilitythis.startAbility(intent);
                          
	this.startAbility(intent);
}                          

Service Ability和Data Ability

Service Ability主要用于后台运行任务(如执行音乐播放、文件下载等),但不提供用户交互界面。

Data Ability有助于应用管理其自身和其他应用存储数据的访问,并提供与其他应用共享数据的方法。Data既可用于同设备不同应用的数据共享,也支持跨设备不同应用的数据共享。

两者共同为PageAbility提供支持.例如:

『牛角书』Ability的学习与使用 HarmonyOS|入门学习-开源基础软件社区

在商品模块中,PageAbility需要展现功能和内容,展现的产品数据就由DataAbility来实现,而商品预约秒杀类的功能则由ServiceAbility来实现

FA 和 PA

『牛角书』Ability的学习与使用 HarmonyOS|入门学习-开源基础软件社区

在整个框架中,FA就是直接与用户交互的模块类似于View层

PA则相当于Service层

感谢

如果您能看到最后,还希望您能动动手指点个赞,一个人能走多远关键在于与谁同行,我用跨越山海的一路相伴,希望得到您的点赞。本篇属个人理解,如有错误望提醒,本人会及时更改。
------------------总结自千锋教育
锋迷商城项目,鸿蒙系统APP开发

Ability概述.md 9.58K 8次下载
已于2022-2-26 23:21:22修改
1
收藏 1
回复
举报
回复
添加资源
添加资源将有机会获得更多曝光,你也可以直接关联已上传资源 去关联
    相关推荐