鸿蒙开发总结(一):基础架构、组件化技术

174 阅读7分钟

鸿蒙操作系统(HarmonyOS)是华为推出的一款面向全场景的分布式操作系统。它以其微内核、分布式架构和高性能等特点,为开发者提供了全新的开发体验。本文将总结鸿蒙开发中的基础架构和组件化技术,并探讨面试中可能遇到的问题。

基础架构

鸿蒙 OS 的基础架构包括微内核、分布式软总线和分布式能力。微内核提供了高安全性和可靠性,而分布式软总线则实现了跨设备的无缝连接和资源共享。分布式能力则允许应用在不同设备上运行,实现真正的 “一次开发,多端部署”。

微内核

鸿蒙 OS 的微内核设计,使其具有高安全性和低时延的特点。面试中可能会问到微内核与传统宏内核的区别,以及微内核在鸿蒙 OS 中的作用。

鸿蒙的微内核将系统服务进行了最小化的抽象和封装,只保留最核心的功能,如进程管理、内存管理等。与传统宏内核相比,微内核的优势在于当某个服务出现问题时,不会影响整个系统的运行,从而提高了系统的稳定性和安全性。

在鸿蒙中,微内核为上层应用提供了稳定的运行基础。例如,在一个简单的鸿蒙应用中,微内核负责调度应用的进程,确保应用能够高效运行。以下是一个简单的鸿蒙应用启动的示例代码(简化示意),展示了微内核在应用启动过程中的基础支持作用:

java

// 假设这是一个鸿蒙应用的主类
public class MainAbility extends Ability {
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        // 在这里进行应用的初始化操作,而这些操作的背后依赖微内核的进程管理等服务
        // 例如加载资源、初始化数据等
        super.setUIContent(ResourceTable.Layout_ability_main);
    }
}

分布式软总线

分布式软总线是鸿蒙 OS 实现设备间通信的关键技术。面试时可能会探讨分布式软总线的工作原理和应用场景。

分布式软总线通过虚拟总线的方式,将不同设备连接在一起,实现设备间的数据传输和资源共享。它支持多种通信协议,能够适应不同设备的网络环境。

例如,在一个智能家居场景中,用户可以通过手机控制家中的智能家电。通过分布式软总线,手机可以与智能家电建立连接,发送控制指令。以下是一个简单的分布式通信示例代码(简化示意),展示了如何使用分布式软总线进行设备间的数据传输:

java

import ohos.distributedschedule.interwork.DeviceInfo;
import ohos.distributedschedule.interwork.DeviceManager;
import ohos.rpc.IRemoteObject;
import ohos.rpc.RemoteException;
import ohos.rpc.RpcCallback;
import ohos.rpc.RpcClient;

// 假设这是一个设备间通信的类
public class DistributedCommunication {
    public void sendDataToAnotherDevice() {
        // 获取目标设备信息
        DeviceInfo targetDevice = getTargetDeviceInfo();
        if (targetDevice != null) {
            // 创建远程对象
            IRemoteObject remoteObject = getRemoteObject();
            if (remoteObject != null) {
                // 创建RpcClient进行通信
                RpcClient rpcClient = new RpcClient(remoteObject);
                try {
                    // 发送数据,这里的数据可以是各种类型,如字符串、对象等
                    rpcClient.callBlocking("sendData", "Hello, another device!", new RpcCallback() {
                        @Override
                        public void onComplete(int i, String s, IRemoteObject iRemoteObject) {
                            // 处理回调结果
                        }
                    });
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private DeviceInfo getTargetDeviceInfo() {
        // 从设备管理器中获取目标设备信息,这里简化处理
        DeviceInfo[] deviceInfos = DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ALL_DEVICE);
        if (deviceInfos != null && deviceInfos.length > 0) {
            return deviceInfos[0];
        }
        return null;
    }

    private IRemoteObject getRemoteObject() {
        // 这里需要根据具体情况获取远程对象,简化示意返回null
        return null;
    }
}

分布式能力

鸿蒙 OS 的分布式能力允许应用跨设备运行。面试中可能会讨论分布式能力的实现机制和优势。

分布式能力通过对应用进行抽象和封装,使得应用可以在不同设备上运行,并且能够根据设备的特点进行自适应调整。例如,一个游戏应用可以在手机、平板和智能电视上运行,并且能够根据设备的屏幕大小和性能进行优化。

以下是一个简单的示例代码(简化示意),展示了如何在鸿蒙应用中利用分布式能力实现多设备适配:

java

import ohos.aafwk.ability.Ability;
import ohos.aafwk.content.Intent;
import ohos.agp.utils.DeviceCapability;

public class DistributedAppAbility extends Ability {
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        // 获取设备能力信息
        DeviceCapability deviceCapability = DeviceCapability.getInstance();
        if (deviceCapability.getDeviceType().equals(DeviceCapability.DeviceType.PHONE)) {
            // 如果是手机设备,加载手机端的布局和资源
            super.setUIContent(ResourceTable.Layout_phone_main);
        } else if (deviceCapability.getDeviceType().equals(DeviceCapability.DeviceType.TABLET)) {
            // 如果是平板设备,加载平板端的布局和资源
            super.setUIContent(ResourceTable.Layout_tablet_main);
        }
    }
}

组件化开发

鸿蒙 OS 支持组件化开发,使得开发者可以构建可复用、模块化的组件。组件化开发的优势在于提高开发效率和代码可维护性。

@Entry

标记页面的入口组件,一个页面中最多只能有一个组件被此装饰器装饰。

以下是一个使用 @Entry 装饰器的示例代码:

java

import ohos.agp.components.Component;
import ohos.agp.components.DirectionalLayout;
import ohos.agp.utils.Color;
import ohos.app.Ability;
import ohos.app.Intent;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;
import ohos.multimodalinput.event.TouchEvent;

import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.ability.Ability;
import ohos.agp.colors.RgbColor;
import ohos.agp.components.*;
import ohos.agp.utils.TextAlignment;
import ohos.app.dispatcher.TaskDispatcher;
import ohos.app.dispatcher.task.TaskPriority;

import static ohos.hiviewdfx.HiLogLabel.LOG_CORE;

@Entry
public class MainAbilitySlice extends AbilitySlice {
    private static final HiLogLabel LABEL = new HiLogLabel(LOG_CORE, 0xD001100, "MainAbilitySlice");

    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        // 创建一个方向布局
        DirectionalLayout layout = new DirectionalLayout(this);
        layout.setWidth(ComponentContainer.LayoutConfig.MATCH_PARENT);
        layout.setHeight(ComponentContainer.LayoutConfig.MATCH_PARENT);
        layout.setOrientation(DirectionalLayout.VERTICAL);

        // 创建一个文本组件
        Text text = new Text(this);
        text.setText("Hello, HarmonyOS!");
        text.setTextSize(20);
        text.setTextColor(Color.BLACK);
        text.setTextAlignment(TextAlignment.CENTER);
        layout.addComponent(text);

        super.setUIContent(layout);
    }

    @Override
    public void onActive() {
        super.onActive();
    }

    @Override
    public void onForeground(Intent intent) {
        super.onForeground(intent);
    }
}

@Component

装饰 struct,使其具备组件化能力,必须实现 build 方法来描述 UI。

以下是一个使用 @Component 装饰器的示例代码:

java

import ohos.agp.components.Component;
import ohos.agp.components.DirectionalLayout;
import ohos.agp.components.Text;
import ohos.agp.utils.Color;
import ohos.agp.utils.TextAlignment;
import ohos.components.Component;

@Component
struct MyComponent {
    build() {
        DirectionalLayout({
            width: ComponentContainer.LayoutConfig.MATCH_PARENT,
            height: ComponentContainer.LayoutConfig.MATCH_PARENT,
            backgroundColor: Color.WHITE
        }) {
            Text({
                text: "This is my custom component",
                fontSize: 18,
                textColor: Color.BLACK,
                textAlignment: TextAlignment.CENTER
            })
        }
    }
}

@Preview

结合 @Entry 和 @Component 实现预览功能,方便开发者查看组件外观和效果。

以下是一个使用 @Preview 装饰器的示例代码:

java

import ohos.aafwk.ability.Ability;
import ohos.aafwk.ability.AbilitySlice;
import ohos.agp.components.Component;
import ohos.agp.components.DirectionalLayout;
import ohos.agp.components.Text;
import ohos.agp.utils.Color;
import ohos.agp.utils.TextAlignment;
import ohos.components.Component;
import ohos.components.Preview;

@Component
struct MyComponent {
    build() {
        DirectionalLayout({
            width: ComponentContainer.LayoutConfig.MATCH_PARENT,
            height: ComponentContainer.LayoutConfig.MATCH_PARENT,
            backgroundColor: Color.WHITE
        }) {
            Text({
                text: "This is my custom component",
                fontSize: 18,
                textColor: Color.BLACK,
                textAlignment: TextAlignment.CENTER
            })
        }
    }
}

@Preview
struct MyComponentPreview {
    build() {
        MyComponent()
    }
}

面试中可能会询问如何使用这些装饰器来构建组件,以及它们在实际开发中的作用和意义。

生命周期管理

鸿蒙 OS 中的生命周期管理包括应用、页面和组件的生命周期。深入理解生命周期对于开发者来说至关重要,它影响着应用的性能和用户体验。

应用生命周期

包括应用的创建、初始化、前台运行、后台运行和销毁等阶段。

以下是一个简单的应用生命周期示例代码(简化示意),展示了在不同生命周期阶段的一些操作:

java

import ohos.aafwk.ability.Ability;
import ohos.aafwk.content.Intent;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;

public class MyAbility extends Ability {
    private static final HiLogLabel LABEL = new HiLogLabel(HiLog.LOG_APP, 0x00200, "MyAbility");

    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        HiLog.info(LABEL, "Application onStart");
        // 应用启动时的初始化操作,如加载配置文件等
    }

    @Override
    public void onActive() {
        super.onActive();
        HiLog.info(LABEL, "Application onActive");
        // 应用进入前台时的操作,如更新UI显示
    }

    @Override
    public void onForeground(Intent intent) {
        super.onForeground(intent);
        HiLog.info(LABEL, "Application onForeground");
        // 应用从后台切换到前台时的操作
    }

    @Override
    public void onBackground(Intent intent) {
        super.onBackground(intent);
        HiLog.info(LABEL, "Application onBackground");
        // 应用进入后台时的操作,如保存数据等
    }

    @Override
    public void onStop() {
        super.onStop();
        HiLog.info(LABEL, "Application onStop");
        // 应用停止时的清理操作,如释放资源等
    }
}

页面生命周期

管理页面的显示和隐藏,处理页面间的跳转。

以下是一个页面生命周期示例代码(简化示意):

java

import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;

public class MyAbilitySlice extends AbilitySlice {
    private static final HiLogLabel LABEL = new HiLogLabel(HiLog.LOG_APP, 0x00200, "MyAbilitySlice");

    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        HiLog.info(LABEL, "AbilitySlice onStart");
        // 页面启动时的操作,如加载页面布局
    }

    @Override
    public void onActive() {
        super.onActive();
        HiLog.info(LABEL, "AbilitySlice onActive");
        // 页面显示在前台时的操作,如更新页面数据
    }

    @Override
    public void onForeground(Intent intent) {
        super.onForeground(intent);
        HiLog.info(LABEL, "AbilitySlice onForeground");
        // 页面从后台切换到前台时的操作
    }

    @Override
    public void onBackground(Intent intent) {
        super.onBackground(intent);
        HiLog.info(LABEL, "AbilitySlice onBackground");
        // 页面进入后台时的操作,如暂停动画等
    }

    @Override
    public void onStop() {
        super.onStop();
        HiLog.info(LABEL, "AbilitySlice onStop");
        // 页面停止时的操作,如清理临时数据
    }
}

组件生命周期

自定义组件的创建到销毁或复用的过程。

以下是一个组件生命周期示例代码(简化示意):

java

import ohos.agp.components.Component;
import ohos.agp.components.DirectionalLayout;
import ohos.agp.components.Text;
import ohos.agp.utils.Color;
import ohos.agp.utils.TextAlignment;
import ohos.components.Component;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;

@Component
struct MyCustomComponent {
    private static final HiLogLabel LABEL = new HiLogLabel(HiLog.LOG_APP, 0x00200, "MyCustomComponent");

    build() {
        HiLog.info(LABEL, "Component build");
        DirectionalLayout({
            width: ComponentContainer.LayoutConfig.MATCH_PARENT,
            height: ComponentContainer.LayoutConfig.MATCH_PARENT,
            backgroundColor: Color.WHITE
        }) {
            Text({
                text: "This is my custom component",
                fontSize: 18,
                textColor: Color.BLACK,
                textAlignment: TextAlignment.CENTER
            })
        }
    }

    onPageShow() {
        HiLog.info(LABEL, "Component onPageShow");
        // 组件显示时的操作,如初始化组件状态
    }

    onPageHide() {
        HiLog.info(LABEL, "Component onPageHide");
        // 组件隐藏时的操作,如保存组件数据
    }

    onDestroy() {
        HiLog.info(LABEL, "Component onDestroy");
        // 组件销毁时的操作,如释放组件资源
    }
}

面试中可能会考察对生命周期管理的理解以及如何在实际开发中应用这些概念。