文章目录
- 1.page生命周期
- 2.跨设备迁移Page
- 3.原子化服务
- 4.config.json
- 5.visibility
- 6.权限
- 7.intent
- 8.线程
- 8.服务卡片
- 10.APP Pack
考点说明
1.page生命周期
MainAbility拥有MainAbilitySlice1和MainAbilitySlice2
当MainAbilitySlice1导航到MainAbilitySlice2时
调用顺序是这样的:首先,MainAbilitySlice1的回调方法onInactive()被调用;然后,MainAbilitySlice2的回调方法onStart()和onActive()分别被调用;最后,MainAbilitySlice1的回调方法onBackground()被调用。
只需要记住这个调用顺序就可以了。
注意:在MainAbilitySlice1导航到MainAbilitySlice2的整个过程中,MainAbility始终处于“ACTIVE”状态。当MainAbility被系统销毁时,其所有已实例化的AbilitySlice都将联动销毁,而不仅是处于前台的AbilitySlice。
2.跨设备迁移Page
跨设备迁移Page的整个过程
- 跨设备迁移Page需要调用方法continueAbility(),调用此方法之后,系统首先回调IAbilityContinuation中的回调方法onStartContinuation(),开发者可以在此方法中决策是否开始迁移当前Page,例如:弹出一个对话框让用户确认是否开始迁移。
- 如果方法onStartContinuation()返回true,那么系统回调IAbilityContinuation中的回调方法onSaveData(),开发者可以在此回调方法中保存当前Page的状态数据,以便当前Page迁移到远程设备之后对其迁移前的状态数据进行恢复。
- 保存当前Page的状态数据之后,系统在远程设备上启动同一个Page,然后调用回调方法onRestoreData(),开发者可以在此方法中恢复Page的状态数据。
- 系统调用回调方法onRestoreData()之后,会继续调用回调方法onStart(),从而开始Page的生命周期。
- 迁移完成后,系统在当前设备上回调方法onCompleteContinuation(),开发者可以在此回调方法中执行结束迁移的动作,例如:结束迁移后销毁当前Page。
3.原子化服务
- 对于某个传统方式的、需要安装的”购物应用T”, 在按照原子化服务理念调整设计后,可以将”商品浏览”独立拆分为一个原子化服务,将”购物车”独立拆分为一个原子化服务,将”支付”独立拆分为一个原子化服务,每个原子化服务都提供了特定的功能,而且是免安装的。用户在用到某个原子化服务时,再按需进行安装,系统程序框架会在后台自动地从原子化服务平台进行下载和安装,而无需用户显式地手动安装。原子化服务的大小不能超过10MB。
- 原子化服务是由原子化服务平台管理和分发的。
- 1个原子化服务确实用于完成1个特定的便捷服务,可由1个或多个HAP包组成。
- 原子化服务在桌面上是没有图标的,用户可以通过服务中心对原子化服务进行统一地查看、搜索和管理。从屏幕左下角或右下角向斜上方滑动,即可进入服务中心。原子化服务在服务中心的显示形式为卡片,可以将其添加到桌面。
- 与传统的需要安装的应用相比,原子化服务是应用的另外一种形态,它是可以提供特定功能的、免安装的、有独立入口的应用形态。
4.config.json
“config.json”由三大部分组成,分别是:“app”、“deviceConfig”和“module”,这三部分缺一不可。
- “app”表示应用的全局配置信息,例如:应用的包名、应用开发厂商的描述、应用的版本信息、等。同一个应用的不同HAP包的“app”配置必须保持一致。
- “deviceConfig”表示应用在具体设备上的配置信息,例如:手机特有的应用配置信息、平板特有的应用配置信息、智慧屏特有的应用配置信息、等。
- “module”表示HAP包的配置信息,例如:HAP包的包名、类名、支持的设备类型、等。
配置文件“config.json”主要涵盖了三个方面的内容: 应用的全局配置信息、应用在具体设备上的配置信息、HAP包的配置信息。
可以在配置文件config.json修改属性deviceType以达到一次开发多端部署的目的。
5.visibility
在布局文件中:
visibility有三个取值,分别是:hide、invisible、visible
其中,hide和invisible都可以将组件设置为不可见,两者的区别在于:hide不会占据布局的空间,而invisible会占据布局的空间。
在Java代码中:
进行设置时根据资源id获得对应的组件Text,然后调用方法setVisibility()设置组件Text的可见性,方法的参数有三个取值,分别是:Component.HIDE、Component.INVISIBLE、Component.VISIBLE,与布局文件中的三个属性值相对应。
6.权限
非敏感权限
- 权限GET_DISTRIBUTED_DEVICE_INFO用于获取分布式组网内的设备列表和设备信息。
- 权限DISTRIBUTED_DEVICE_STATE_CHANGE用于获取分布式组网内设备的状态变化。
- 权限GET_BUNDLE_INFO用于查询其他应用的信息。
这3个权限都为非敏感权限。非敏感权限不涉及用户的敏感数据或危险操作,仅需在config.json中申请,应用安装后即被系统授权。
敏感权限
- 权限DISTRIBUTED_DATASYNC用于不同设备间的数据交换。
敏感权限涉及用户的敏感数据或危险操作,除了在config.json中申请之外,还需要在代码中动态申请,通过运行时发送弹窗的方式请求用户授权。
所有权限全都需要通过"reqPermissions"进行申请。在MainAbility的回调方法onStart()中,还必须动态申请config.json中的敏感权限。
public class MainAbility extends Ability {
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setMainRoute(MainAbilitySlice.class.getName());
// 将所有要动态申请的权限存放在一个字符串数组中
String[] permissions = {
"ohos.permission.DISTRIBUTED_DATASYNC"};
// 初始化可以动态申请权限的列表
List<String> canRequestPermissions = new ArrayList<>();
// 遍历所有要动态申请的权限
for (String permission : permissions) {
// 如果当前应用没有被用户授予指定的权限
if (verifySelfPermission(permission) != IBundleManager.PERMISSION_GRANTED) {
// 如果可以动态申请指定的权限
if (canRequestPermission(permission)) {
// 将指定的权限添加到可以动态申请权限的列表中
canRequestPermissions.add(permission);
}
}
}
// 通过运行时发送弹窗的方式请求用户授予指定的权限
requestPermissionsFromUser(
canRequestPermissions.toArray(new String[0]), 0);
}
}
说明:
将所有要动态申请的权限存放在一个字符串数组中,然后遍历该数组。对于遍历过程中的当前迭代权限permission,如果当前应用没有被用户授予该权限,再进行判断,如果可以动态申请该权限,那么就将该权限添加到一个列表中,这需要在for循环之前构造一个列表。如果不可动态申请该权限,说明已被用户或系统禁止授权。
for循环结束后,调用方法requestPermissionsFromUser(),通过运行时发送弹窗的方式请求用户授予指定的权限,传入的第一个参数,是列表canRequestPermissions对应的数组;传入的第二个参数,是一个非负的整数,表示请求码,我们指定为0。
7.intent
Intent中封装的内容包括两大类,一类是执行的操作,一类是传递的参数。对于要执行的操作,包括七部分,分别是:Action、Entity、Uri、Flags、BundleName、AbilityName、DeviceId。
示例代码:
public class MainAbilitySlice extends AbilitySlice {
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main);
Button btn = (Button) findComponentById(ResourceTable.Id_btn);
btn.setClickedListener(component -> {
List<String> onlineDeviceIdList = DeviceUtils.getOnlineDeviceIdList();
if (onlineDeviceIdList != null && !onlineDeviceIdList.isEmpty()) {
String remoteTargetDeviceId = onlineDeviceIdList.get(0);
Intent remoteIntent = new Intent();
Operation operation = new Intent.OperationBuilder()
.withDeviceId(remoteTargetDeviceId)
.withBundleName(getBundleName())
.withAbilityName(SecondAbility.class.getName())
.withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE)
.build();
remoteIntent.setOperation(operation);
}
});
}
}
说明:
首先,构造一个Intent.OperationBuilder()的实例,然后,链式调用多个方法。例如,调用方法withDeviceId(),传入参数remoteTargetDeviceId,指定远程设备的id;调用方法withBundleName(),传入参数getBundleName(),指定应用的包名;调用方法withAbilityName(),传入参数SecondAbility.class.getName(),指定远程Page的类名;调用方法withFlags(),传入参数Intent.FLAG_ABILITYSLICE_MULTI_DEVICE,设置支持分布式的标记,以设置该应用支持分布式调度;最后,调用方法build(),构造一个Operation类型的实例,赋值给变量operation。这样,就将remoteIntent相关的操作都封装在了operation中,只需要再调用remoteIntent的方法setOperation(),把operation指定为参数就可以了
8.线程
在鸿蒙操作系统中,一个应用通常对应一个进程。在应用启动时,系统会为该应用的进程创建一个主线程,所有的操作都在主线程上执行。UI界面的显示和更新等操作,也都在主线程上进行,因此,主线程又称为UI线程。
对于UI线程,需要注意的是,不能将耗时操作放在UI线程中,以避免将UI线程阻塞,需要单独创建子线程来完成耗时操作。
对于UI线程,还有一点需要注意,在非UI线程中不能更新UI组件,必须在UI线程中进行更新。常见的做法是调用方法 getUIDispatcher() 得到绑定到UI线程的专有任务分发器,然后向UI线程分发更新UI的任务。
8.服务卡片
简化:
- 图的最左边是卡片提供方,要么是传统应用,要么是原子化服务。之所以将两者称之为卡片提供方,是因为传统应用或原子化服务中的Page Ability为卡片提供了表现素材,卡片是Page Ability的表现形式。在传统应用或原子化服务中定义了卡片的生命周期回调方法。
- 图的最右边是卡片使用方,要么是桌面,要么是服务中心。之所以将两者称之为卡片使用方,是因为用户通过桌面或服务中心来使用卡片。
- 图的中间是卡片管理服务,他是卡片的大管家,是卡片提供方和卡片使用方的中介和桥梁。以卡片的定时或定点刷新为例,如果一个卡片在config.json中配置了定时或定点刷新,具体的流程是这样的:
第1步,timer事件会通知卡片管理服务;
第2步,卡片管理服务会去卡片提供方的对象管理模块中找到对应的卡片提供方;
第3步,卡片提供方回调卡片的生命周期刷新方法;
第4步,卡片提供方将刷新数据返回给卡片管理服务;
第5步,卡片管理服务根据卡片名称查找卡片使用方;
第6步,卡片管理服务刷新卡片使用方的卡片。
10.APP Pack
HarmonyOS应用的发布形态为APP Pack(简称APP),它是由一个或多个HAP包以及描述APP Pack属性的pack.info文件组成。
HAP是Ability的部署包,HarmonyOS应用代码围绕Ability组件展开,它是由一个或多个Ability组成。
Ability分为两种类型:FA和PA,两者是应用的基本组成单元,能够实现特定的业务功能。FA有UI界面,而PA无UI界面。
一个HAP在工程目录中对应一个Module,可以分为Entry和Feature两种类型。Entry是应用的主模块,在一个APP中,对于同一设备类型必须有且只有一个entry类型的HAP,可独立安装运行。Feature是应用的动态特性模块,一个APP可以包含一个或多个feature类型的HAP,也可以不含。
HAP是Ability的部署包,HarmonyOS应用代码围绕Ability组件展开,它是由一个或多个Ability组成。Ability分为两种类型:FA(Feature Ability,中文名称:元程序)和PA(Particle Ability,中文名称:元服务)。FA/PA是应用的基本组成单元,能够实现特定的业务功能。