前言:深入浅出HarmonyOS应用开发

从Android应用开发到HarmonyOS应用开发

type
status
date
slug
summary
tags
category
icon
password
 

一、Harmony和Android应用开发对比

这篇文章是给有Android开发经验的同学参考,如何平滑的从Android应用开发转身HarmonyOS应用开发。Android中的概念大家都比较熟悉了,梳理Harmony和Android应用开发对比,如下:
大类
子类
Android
Harmony
四大组件
组件
Activity
UIAbility
组件
Service
ServiceExtensionAbility
组件
Content Provider
DataShareExtensionAbility
组件
BroadCast Receiver
CES(Common Event Service)
常用组件
组件
Fragment
Page
组件
Handler
Emitter
意图
Intent
Want
Web
WebView
WebView
UI布局
UI范式
命令式
声明式
布局组件
LinearLayout
Row、Column
布局组件
RelativeLayout
RelativeContainer
布局组件
FrameLayout
Stack
布局组件
FlexboxLayout
Flex
像素单位
控件像素
DP(Device Independent Pixels)
VP(Virtual Pixels)
文本像素
SP(Scale-independent Pixels)
FP(Font-size Pixels)
通信
进程间通信(IPC)
AIDL Binder
IDL
序列化
Parcelable
Sequenceable
线程间通信
Thread/AsyncTask
Worker
持久化
简单配置存储
SharedPreferences
Preferences
关系型存储
SQLite
SQLite
构建
构建工具
Gradle
Hvigor
UT工具
Junit、Robolectric
Hypium
权限
android.permission
ohos.permission
清单文件
AndroidManifest.xml
app.json、module.json
开发语言
Java、Kotlin、C++
ArkTS、JS、C++、Rust
二进制发布
发布包
apk、aab
hap(HarmonyOS Ability Package)、app
Lib库
aar
har(Harmony Archive)
可见,Harmony单框架中的技术栈并不是从0到1全新的技术栈,很多Harmony中的概念都可以和Android关联起来,但不完全等价,比如:
1、Android中的Activity和Harmony中的UIAbility,Andoird中Activity本身就是一个Context,但是在Harmony中,Context是UIAbility的一个属性。
2、UI范式:声明UI也不是Harmony新引入的概念,像Google的Flutter、IOS的SwiftUI中很早就引入了声明式UI范式。
💡
如何理解UI范式?
  1. 通过声明式语法绘制UI
  1. 状态驱动UI更新
 

二、Harmony应用发布形态

2.1 应用发布形态
Harmony中,应用Hap(app)包的发布流程:
notion image
关键点:
1、预置Rom都是Hap包,可以有多个Hap一起预置,App包只用于商家应用市场。
2、Hap包是真正安装到设备的可执行单元,App包不能直接安装,主要用于上架应用市场打包、重签及分发。
3、应用市场分发策略通过Module.json中的deviceType和deliveryWithInstall来区分安装时分发还是按需分发。
2.2 开发态和编译态对比
notion image
关键点:
1、一个开发态的Module编译后生成一个部署态的Hap,Module和Hap一一对应。
2、Hap中的module.json是AppScope中的app.json5和module.json5的组合。
3、Hap中的resources是AppScope中的资源和entry中资源的组合。
4、AppScope目录下的文件名雨Entry、Feature模块下面的文件名不能重复,否则IDE会报错。
 

三、应用开发模型(Stage)

Stage模型不是一个具象的概念,它是应用组件、进程模型、线程模型、后台人物管理等组合的抽象概念,建议看Stage模型不要孤立的去看,它也是从FA模型逐步演进过来的,和FA模型对比着分析会更好理解。
先看一下HarmonyOS应用模型的构成要素:
应用模型的构成要素
应用模型是系统为开发者提供的应用程序所需能力的抽象提炼,它提供了应用程序必备的组件和运行机制。有了应用模型,开发者可以基于一套统一的模型进行应用开发,使应用开发更简单、高效。
应用模型的构成要素包括:
  1. 应用组件
    1. 应用组件是应用的基本组成单位,是应用的运行入口。用户启动、使用和退出应用过程中,应用组件会在不同的状态间切换,这些状态称为应用组件的生命周期。应用组件提供生命周期的回调函数,开发者通过应用组件的生命周期回调感知应用的状态变化。应用开发者在编写应用时,首先需要编写的就是应用组件,同时还需编写应用组件的生命周期回调函数,并在应用配置文件中配置相关信息。这样,操作系统在运行期间通过配置文件创建应用组件的实例,并调度它的生命周期回调函数,从而执行开发者的代码。
  1. 应用进程模型
    1. 应用进程模型定义应用进程的创建和销毁方式,以及进程间的通信方式。
  1. 应用线程模型
    1. 应用线程模型定义应用进程内线程的创建和销毁方式、主线程和UI线程的创建方式、线程间的通信方式。
  1. 应用任务管理模型(仅对系统应用开放)
    1. 应用任务管理模型定义任务(Mission)的创建和销毁方式,以及任务与组件间的关系。所谓任务,即用户使用一个应用组件实例的记录。每次用户启动一个新的应用组件实例,都会生成一个新的任务。例如,用户启动一个视频应用,此时在“最近任务”界面,将会看到视频应用这个任务,当用户点击这个任务时,系统会把该任务切换到前台,如果这个视频应用中的视频编辑功能也是通过应用组件编写的,那么在用户启动视频编辑功能时,会创建视频编辑的应用组件实例,在“最近任务”界面中,将会展示视频应用、视频编辑两个任务。
  1. 应用配置文件
    1. 应用配置文件中包含应用配置信息、应用组件信息、权限信息、开发者自定义信息等,这些信息在编译构建、分发和运行阶段分别提供给编译工具、应用市场和操作系统使用。
应用模型概况
随着系统的演进发展,先后提供了两种应用模型:
  • FA(Feature Ability)模型:从API 7开始支持的模型,已经不再主推。
  • Stage模型:从API 9开始新增的模型,是目前主推且会长期演进的模型。在该模型中,由于提供了AbilityStage、WindowStage等类作为应用组件和Window窗口的“舞台”,因此称这种应用模型为Stage模型。
FA模型与Stage模型差异概览:
分类
FA模型
Stage模型
应用组件
1.应用组件 - PageAbility组件:包含UI,提供展示UI的能力。详细介绍请参见PageAbility组件概述。 - ServiceAbility组件:提供后台服务的能力,无UI。详细介绍请参见ServiceAbility组件概述。 - DataAbility组件:提供数据分享的能力,无UI。详细介绍请参见DataAbility组件概述。 2. 开发方式 通过导出匿名对象、固定入口文件的方式指定应用组件。开发者无法进行派生,不利于扩展能力。
1.应用组件 - UIAbility组件:包含UI,提供展示UI的能力,主要用于和用户交互。详细介绍请参见UIAbility组件概述。 - ExtensionAbility组件:提供特定场景(如卡片、输入法)的扩展能力,满足更多的使用场景。详细介绍请参见ExtensionAbility组件概述。 2. 开发方式 采用面向对象的方式,将应用组件以类接口的形式开放给开发者,可以进行派生,利于扩展能力。
进程模型
有两类进程:1. 主进程2. 渲染进程详细介绍请参见进程模型
有三类进程:1. 主进程2. ExtensionAbility进程3. 渲染进程详细介绍请参见进程模型
线程模型
1. ArkTS引擎实例的创建   一个进程可以运行多个应用组件实例,每个应用组件实例运行在一个单独的ArkTS引擎实例中。2. 线程模型   每个ArkTS引擎实例都在一个单独线程(非主线程)上创建,主线程没有ArkTS引擎实例。3. 进程内对象共享:不支持。详细介绍请参见线程模型
1. ArkTS引擎实例的创建   一个进程可以运行多个应用组件实例,所有应用组件实例共享一个ArkTS引擎实例。2. 线程模型   ArkTS引擎实例在主线程上创建。3. 进程内对象共享:支持。详细介绍请参见线程模型
任务管理模型
- 每个PageAbility组件实例创建一个任务。- 任务会持久化存储,直到超过最大任务个数(根据产品配置自定义)或者用户主动删除任务。- PageAbility组件之间不会形成栈的结构。详细介绍请参见任务管理场景介绍
- 每个UIAbility组件实例创建一个任务。- 任务会持久化存储,直到超过最大任务个数(根据产品配置自定义)或者用户主动删除任务。- UIAbility组件之间不会形成栈的结构。详细介绍请参见任务管理场景介绍
应用配置文件
使用config.json描述应用信息、HAP信息和应用组件信息。详细介绍请参见应用配置文件概述(FA模型)
使用app.json5描述应用信息,module.json5描述HAP信息、应用组件信息。详细介绍请参见应用配置文件概述(Stage模型)