了解Ability中的ServiceAbility
简介
我们知道Ability是应用所具备的能力抽象,Ability又分为FA(Feature Ability)和PA(Particle Ability)两种类型,PageAbility就是FeatureAbility模板,用于提供应用与用户的交互功能,ParticleAbility又包含ServiceAbility和DataAbility两种类型,ServiceAbilit用于提供后台运行任务的能力,DataAbility用于对外部提供统一的数据访问能力。
简而言之,ServiceAbility也是一个Ability,那么创建就和我们创建PageAbility的方法差不多,但是在config.json里面注册的时候要将type设置成service就可以了。
Service的创建
通过File-new-Ability-Empty Service Ability的方法可以直接创建一个空的ServiceAbility
创建完成之后工具会自动帮我们在config.json里面注册该service,并且type设置成了service类型
{
"name": "com.example.demo1.LocalServiceAbility",
"icon": "$media:icon",
"description": "$string:serviceability_description",
"type": "service"
}
创建完成之后有以下几点需要注意:
- service是单例运行的,在通一个设备上,相同的service只能有一个。
- service可以允许多个业务Ability公用这个实例,当有多个业务公用这个service时,需要所有业务Ability都解绑之后才能停止该service。
- service是运行在主线程的,所以要执行数据库或者解析大文件等耗时操作的时候需要开启新的线程进行处理。
Service生命周期
先通过一张图来了解一下Servcice在被调用之后执行的步骤
Service创建步骤:
- 当有业务调用startAbility时,service会进入initial状态;
- 当Service从initial状态变成inactive非激活状态时会调用onStart()这个回调方法。
- 当Service从inactive状态变成active状态时会调用onCommond()这个回调方法。
- 当用户发出指令调用stopAbility停止Service时,Serivce会调用onBackGround()方法,这时Service的状态会从active变成background状态。
- 最后调用onStop()方法结束该Service。
回调方法:
- onStart() 该方法在创建Service的时候调用,用于Service的初始化。在Service的整个生命周期只会调用一次,调用时传入的Intent应为空。
- onCommand() 在Service创建完成之后调用,该方法在客户端每次启动该Service时都会调用,用户可以在该方法中做一些调用统计、初始化类的操作。
- onStop() 在Service销毁时调用。Service应通过实现此方法来清理任何资源,如关闭线程、注册的侦听器等。
Service从被业务调用startAbility开始就会在后台一直存在,不会自动关闭,只有当手机内存不够了,在回收一些长期不使用的资源的时候会回收,当然我们也可以通过stopAbility来停止service,然后系统将该service销毁。
本地Service的启动和停止
我们都知道Service是一个Ability,那么就可以使用Ability的启动方式进行启动,通过Intent这个意图包裹住Service的相关信息,就可以启动Service,这里有一点需要注意,启动Service是无法返回数据的,就比如A手机操作B手机的service进行媒体播放,那么只能控制播放和停止,无法返回具体的数据。