现在的官网文档和特性更新很快很频繁,所以指不定啥时候就增加/删除一些东西了,有错误很正常,提醒我修改下。
1. Ability 是如何与用户交互的?
界面显示:Ability 可以包含一个或多个 AbilitySlice,用于显示 UI 界面并与用户进行交互。
事件:Ability 可以处理用户的输入事件,如触摸、按键等。
数据绑定:Ability 可以使用数据绑定机制,将 UI 组件与数据模型绑定,实现数据的自动更新和交互。
通知:Ability 可以通过系统通知机制向用户发送通知,即使应用不在前台运行。
2. 如何实现应用的多语言支持?
资源文件:为每种语言创建资源文件(如 string.json),并在里面定义所有可本地化的字符串。
资源引用:在代码中使用资源 ID 引用字符串,而不是硬编码文本。
系统设置:应用会自动根据系统设置的语言环境加载相应的资源文件。
动态切换:支持在应用运行时切换语言,并动态更新 UI。
3. 分布式数据库是如何实现数据同步的?
分布式事务:确保跨设备的数据库操作具有原子性、一致性、隔离性和持久性。
数据版本控制:为数据添加版本号,确保同步时数据的一致性。
冲突解决策略:定义冲突解决策略,处理并发操作导致的数据冲突。
网络状态感知:根据网络状态智能同步数据,优化同步效率和流量使用。
4. 如何优化应用的性能?
内存管理:合理分配和释放内存,避免内存泄漏。
后台优化:合理使用后台服务和定时任务,避免不必要的后台运行。
UI 渲染优化:使用轻量级的 UI 组件,减少布局复杂度,优化渲染性能。
资源优化:压缩图片和媒体资源,减少应用的体积和加载时间。
5. HarmonyOS 中的权限管理模型是怎样的?
权限声明:应用在 config.json 中声明所需的权限。
权限申请:在应用运行时,根据需要动态申请权限。
权限检查:在执行敏感操作前,检查是否已获得相应权限。
权限分组:系统将权限分为不同的组,便于管理和申请。
6. LazyForEach 是什么?
LazyForEach
是一个用于高效渲染列表的组件或功能,它允许开发者在用户滚动列表时才加载和渲染列表项,而不是一次性渲染整个列表。这种按需渲染的方式可以显著提高应用的性能,特别是在处理大量数据时。
7. LazyForEach 的工作原理是什么?
LazyForEach
的工作原理通常是基于用户的滚动位置来动态地创建和销毁列表项的组件实例。当用户滚动到列表的某个部分时,LazyForEach 会加载并渲染那些即将进入视图的列表项,同时可能会卸载那些滚出视图的列表项,以节省内存和计算资源。
8. Router.replace()方法的作用是什么?和 Router.pushUrl()方法有什么区别?
Router.replace()
方法用于替换当前路由,并将目标路由压入栈顶。与Router.pushUrl()
方法不同,Router.replace()
方法不会保留当前路由,而是直接替换掉当前路由。
9. 如何实现应用的沉浸式模式?
沉浸式模式是指应用界面呈现出沉浸式的全屏模式,不留任何系统 UI,用户只能看到应用内容。在沉浸式模式下,应用的 UI 元素会被覆盖,但系统状态栏、导航栏、键盘等系统 UI 依然可见。以下是实现步骤
设置窗口属性:
在应用的入口 Ability 中,可以通过设置窗口属性来实现沉浸式模式。这通常涉及到配置窗口特性(Window Features)来隐藏状态栏和导航栏。
使用系统 API:
鸿蒙 OS 提供了 API 来控制系统 UI 的显示和隐藏。你可以在应用的代码中调用这些 API 来实现沉浸式效果。
配置应用的配置文件:
在应用的 config.json 或其他配置文件中,可以声明应用需要的窗口特性,如 ohos:immersive。
动态切换:
应用可以根据用户的交互或特定场景动态地进入或退出沉浸式模式。这可能涉及到监听用户的手势或其他事件来切换 UI 状态。
适配不同设备:
不同的设备可能有不同的屏幕和系统 UI,因此在实现沉浸式模式时,需要考虑不同设备的适配问题。
10. 如何获取屏幕的安全区域?
可以通过设置组件的 expandSafeArea
属性来获取获取 UIWindow
:首先,你需要获取到当前页面的 UIWindow 实例。
调用 getSafeArea
方法:通过 UIWindow
实例调用 getSafeArea
方法来获取安全区域的 Rect 对象。
示例:
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.window.UIWindow;
import ohos.agp.utils.Rect;
public class MyAbilitySlice extends AbilitySlice {
@Override
public void onStart(Intent intent) {
super.onStart(intent);
setUIContent(new SurfaceLayout(this));
UIWindow window = getUIWindow();
if (window != null) {
// 获取安全区域
Rect safeArea = window.getSafeArea();
// 在这里可以使用safeArea对象,它包含了安全区域的位置和尺寸信息
// 例如,可以使用safeArea.left, safeArea.top, safeArea.right, safeArea.bottom
}
}
}
11. ArkTs 是什么?
ArkTs 介绍
ArkTS 是 HarmonyOS 优选的主力应用开发语言。保持了 TypeScript 的基本风格,同时通过规范定义强化开发期静态检查和分析,提升程序执行稳定性和性能。
ArkTS 的主要特点包括:
静态类型检查:ArkTS 在编译时进行类型检查,这有助于在代码运行前发现和修复错误,提高代码的稳定性和性能。
声明式 UI:ArkTS 定义了声明式 UI 描述,允许开发者以更简洁、更自然的方式开发跨端应用。
状态管理:ArkTS 提供了多维度的状态管理机制,使得与 UI 相关联的数据可以在组件内使用,也可以在不同组件层级间传递,支持单向和双向数据流。
渲染控制:ArkTS 支持条件渲染、循环渲染和数据懒加载,允许开发者根据应用的不同状态渲染 UI 内容。
兼容性:ArkTS 兼容 TS/JavaScript 生态,开发者可以使用 TS/JS 进行开发或复用已有代码。
并发机制:ArkTS 支持轻量化的并发机制,允许开发者编写并发代码,提高应用的性能和响应速度。
12. ArkTs 与 TypeScript 有什么区别?(答 5 点以上)
ArkTs 官方文档
ArkTS 是基于 TypeScript 开发的框架,但是有一些限制和差异。ArkTS 旨在提供更严格的类型检查和优化的代码性能,同时确保与 HarmonyOS 的开发环境和特性兼容。
以下是 ArkTS 与 TypeScript 的差异:
生成器函数:ArkTS 不支持 TypeScript 中的生成器函数(使用 function* 定义的函数),应使用 async 或 await 机制进行并行任务处理 。
参数解构:在函数参数中使用解构赋值是 TypeScript 的特性,ArkTS 不支持参数解构,需要显式传递参数 。
函数内声明函数:TypeScript 允许在函数内部声明新的函数,而 ArkTS 不支持在函数内声明函数,应使用 lambda 函数代替 。
new.target:ArkTS 不支持 new.target 元属性,这是 TypeScript 中用于反射的属性 。
确定赋值断言:TypeScript 中的 ! 确定赋值断言在 ArkTS 中不被支持,应初始化变量或使用其他方式确保赋值 。
原型上的赋值:ArkTS 不支持在对象的原型上进行赋值,这与 TypeScript 不同 。
globalThis:ArkTS 不支持 globalThis,这是 TypeScript 中用于获取全局对象的属性 。
Function.prototype.apply、Function.prototype.call 和 Function.prototype.bind:ArkTS 不支持这些函数,它们在 TypeScript 中用于控制函数的 this 绑定 。
instanceof 和 as 类型保护:ArkTS 不支持 is 运算符,必须使用 instanceof 运算符替代,并且在使用之前,必须使用 as 运算符将对象转换为需要的类型 。
接口继承类:在 TypeScript 中,接口可以继承类,但在 ArkTS 中,接口只能继承接口 。
构造函数类型:ArkTS 不支持使用构造函数类型,应改用 lambda 函数 。
enum 声明合并:ArkTS 不支持 enum 声明合并,所有相关的枚举成员必须在同一个声明中 。
命名空间作为对象:ArkTS 不支持将命名空间用作对象,可以使用类或模块替代 。
非声明语句在命名空间中:ArkTS 中,命名空间用于定义标志符可见范围,不支持命名空间中的非声明语句 。
import default as:ArkTS 不支持 import default as ... 语法,应使用显式的 import ... from ... 语法 。
require 和 import 赋值表达式:ArkTS 不支持通过 require 导入,也不支持 import 赋值表达式,应使用 import 语法 。
ambient 模块声明:ArkTS 不支持 declare module 语法,应直接导入需要的内容 。
new.target:ArkTS 不支持 new.target 元属性,这是 TypeScript 中用于反射的属性 。
Function.prototype.apply、Function.prototype.call 和 Function.prototype.bind:ArkTS 不支持这些函数,它们在 TypeScript 中用于控制函数的 this 绑定 。
as const 断言:ArkTS 不支持 as const 断言,这是 TypeScript 中用于标注字面量的相应字面量类型的语法 。
any:ArkTS 不支持 any 类型, 应使用更具体的类型替代 。
13. @Provider 和@Consumer vs @Provide 和@Consume 的区别?
14. @Prop 和@ObjectLink 装饰器有什么区别?
用途
@Prop 装饰器:主要用于在组件之间传递数据,将父组件的值传递给子组件。它定义了子组件的属性,可以接收来自父组件的赋值。
@ObjectLink
用于建立对象之间的链接,通常用于在组件内部或组件之间共享和同步状态。
它可以将一个对象的属性与另一个对象的属性进行链接,当一个对象的属性发生变化时,另一个对象的属性也会自动更新。
数据传递方式
@Prop:是单向的数据传递,从父组件到子组件。父组件可以设置子组件的 @Prop 属性值,但子组件不能直接修改这个值。
@ObjectLink 是双向的数据传递,父组件和子组件都可以修改子组件的 @ObjectLink 属性值。
性能
@Prop 会深拷贝数据,具有拷贝的性能开销,性能低于 @ObjectLink 详见官方文档。
Thank you for reading.
推荐阅读
• 前端埋点
欢迎关注我的公众号“全栈开发ck”,原创技术文章第一时间推送。