鸿蒙App页面相关

鸿蒙App页面相关

Ability

  • Ability是应用所具备能力的抽象,也是应用程序的重要组成部分。一个应用可以具备多种能力(即可以包含多个Ability)
  • Ability可以分为FA(Feature Ability)和PA(Particle Ability)两种类型;
  • 在配置文件(config.json)中注册Ability时,可以通过配置Ability元素中的“type”属性来指定Ability模板类型,“type”的取值可以为“page”、“service”或“data”,分别代表Page模板、Service模板、Data模板。

Page Ability

其实这个东西和安卓的Activity意义差不多,就是提供一个和用户交互的窗口,而**AbilitySlice**其实就是相当于fragment,一个Page里面可以有多个AbilitySlice就是相当于一个Activity中有多个fragment,都是有独立的生命周期。
  • setMainRoute:设置默认展示AbilitySlice
  • addActionRoute:添加其他的要展示的AbilitySlice,其中router要在abilities-skills-actions下定义

生命周期:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6ilg8Xvn-1626320835106)(blogpic.momentsoflife.work/小书匠/1624866478745.png)]

  • onStart() 相当于安卓的onCreate(),仅执行一次,且是布局的初始化使用,调用后进入INACTIVE状态;
  • onActive()相当于安卓的onResume(),用户重新回到该page时回调;
  • onInactive()相当于安卓的onPause(),用户离开该page时调用;
  • onBackground()相当于安卓的onSaveInstanceState(),页面进入不可见状态,释放部分无用资源;
  • onForeground()相当于安卓的onRestoreInstanceState(),页面准备进入可见状态,部分资源需要重新获取或者初始化;
  • onStop()和安卓的名没咋变,功能也一样,页面销毁时调用
    原因如下:
    1、用户通过系统管理能力关闭指定Page,例如使用任务管理器关闭Page。
    2、用户行为触发Page的terminateAbility()方法调用,例如使用应用的退出功能。
    3、配置变更导致系统暂时销毁Page并重建。
    4、系统出于资源管理目的,自动触发对处于BACKGROUND状态Page的销毁。

页面切换

对应两个slice的生命周期方法回调顺序为:

FooAbilitySlice.onInactive() --> BarAbilitySlice.onStart() --> BarAbilitySlice.onActive() --> FooAbilitySlice.onBackground()

  • AbilitySlice同一page内切换使用present(new TargetSlice(), new Intent()),带返回的页面切换presentForResult(new TargetSlice(), new Intent(), 0),返回结果由导航目标AbilitySlice在其生命周期内通过setResult()进行设置,接收方通过onResult()接收。(PS:系统为每个Page维护了一个AbilitySlice实例的栈,当开发者在调用present()或presentForResult()时指定的AbilitySlice实例已经在栈中存在时,则栈中位于此实例之上的AbilitySlice均会出栈并终止其生命周期)

  • 不同Page间导航,可以使用startAbility()或startAbilityForResult()方法,获得返回结果的回调为onAbilityResult()。在Ability中调用setResult()可以设置返回结

  • 跨设备迁移,需要在需要迁移的page中实现IAbilityContinuation接口

    1、*onStartContinuation()*:Page请求迁移后,系统首先回调此方法,开发者可以在此回调中决策当前是否可以执行迁移,比如,弹框让用户确认是否开始迁移。
    
    2、*onSaveData()*:如果onStartContinuation()返回true,则系统回调此方法,开发者在此回调中保存必须传递到另外设备上以便恢复Page状态的数据。
    
    3、*onRestoreData()*:源侧设备上Page完成保存数据后,系统在目标侧设备上回调此方法,开发者在此回调中接受用于恢复Page状态的数据。注意,在目标侧设备上的Page会重新启动其生命周期,无论其启动模式如何配置。且系统回调此方法的时机在onStart()之前。
    
     4、onCompleteContinuation()*:目标侧设备上恢复数据一旦完成,系统就会在源侧设备上回调Page的此方法,以便通知应用迁移流程已结束。开发者可以在此检查迁移结果是否成功,并在此处理迁移结束的动作,例如,应用可以在迁移完成后终止自身生命周期。
     
     5、*onRemoteTerminated()*:如果开发者使用continueAbilityReversibly()而不是continueAbility(),则此后可以在源侧设备上使用reverseContinueAbility()进行回迁。这种场景下,相当于同一个Page(的两个实例)同时在两个设备上运行,迁移完成后,如果目标侧设备上Page因任何原因终止,则源侧Page通过此回调接收终止通知。
     
     请求迁移:实现IAbilityContinuation的Page可以在其生命周期内,调用continueAbility()或continueAbilityReversibly()请求迁移。两者的区别是,通过后者发起的迁移此后可以进行回迁。
     
     请求回迁:使用continueAbilityReversibly()请求迁移并完成后,源侧设备上已迁移的Page可以发起回迁,以便使用户活动重新回到此设备。(reverseContinueAbility())
    

Service Ability

基于Service模板的Ability(以下简称“Service”)主要用于后台运行任务(如执行音乐播放、文件下载等),但不提供用户交互界面。Service可由其他应用或Ability启动,即使用户切换到其他应用,Service仍将在后台继续运行。

  • Service是单实例的。在一个设备上,相同的Service只会存在一个实例
  • 如果多个Ability共用这个实例,只有当与Service绑定的所有Ability都退出后,Service才能够退出
  • 由于Service是在主线程里执行的,因此,如果在Service里面的操作时间过长,开发者必须在Service里创建新的线程来处理(详见线程间通信),防止造成主线程阻塞,应用程序无响应

生命周期

onStart()  
   该方法在创建Service的时候调用,用于Service的初始化。在Service的整个生命周期只会调用一次,调用时传入的Intent应为空。
   
onCommand()
   在Service创建完成之后调用,该方法在客户端每次启动该Service时都会调用,用户可以在该方法中做一些调用统计、初始化类的操作。
   
onConnect()
    在Ability和Service连接时调用,该方法返回IRemoteObject对象,用户可以在该回调函数中生成对应Service的IPC通信通道,以便Ability与Service交互。Ability可以多次连接同一个Service,系统会缓存该Service的IPC通信对象,只有第一个客户端连接Service时,系统才会调用Service的onConnect方法来生成IRemoteObject对象,而后系统会将同一个RemoteObject对象传递至其他连接同一个Service的所有客户端,而无需再次调用onConnect方法。
	
onDisconnect()
   在Ability与绑定的Service断开连接时调用。
   
onStop()
   在Service销毁时调用。Service应通过实现此方法来清理任何资源,如关闭线程、注册的侦听器等。

启动

和普通的页面跳转逻辑一致;如果Service尚未运行,则系统会先调用onStart()来初始化Service,再回调Service的onCommand()方法来启动Service。如果Service正在运行,则系统会直接回调Service的onCommand()方法来启动Service。

停止

Service一旦创建就会一直保持在后台运行,除非必须回收内存资源,否则系统不会停止或销毁Service。开发者可以在Service中通过terminateAbility()停止本Service或在其他Ability调用stopAbility()来停止Service。

连接

通过connectAbility() 连接回调,需要传入目标Service的Intent与IAbilityConnection的实例,其中intent的实现和页面跳转的intent设置基本一致。
service中的onConnect()需要返回一个IRemoteObject对象,HarmonyOS提供了IRemoteObject的默认实现,用户可以通过继承LocalRemoteObject来创建自定义的实现类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值