码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 鸿蒙HarmonyOS实战-Stage模型(进程模型)


    合集 - 鸿蒙入门实战全套(核心知识点)(53)
    1.鸿蒙HarmonyOS实战-ArkTS语言(基本语法)03-202.鸿蒙HarmonyOS实战-ArkTS语言(状态管理)03-213.鸿蒙HarmonyOS实战-ArkTS语言(渲染控制)03-214.鸿蒙HarmonyOS实战-ArkUI组件(Row/Column)03-225.鸿蒙HarmonyOS实战-ArkUI组件(Stack)03-236.鸿蒙HarmonyOS实战-ArkUI组件(Flex)03-247.鸿蒙HarmonyOS实战-ArkUI组件(RelativeContainer)03-258.鸿蒙HarmonyOS实战-ArkUI组件(GridRow/GridCol)03-269.鸿蒙HarmonyOS实战-ArkUI组件(mediaquery)03-2710.鸿蒙HarmonyOS实战-ArkUI组件(List)03-2911.鸿蒙HarmonyOS实战-ArkUI组件(Grid/GridItem)03-2912.鸿蒙HarmonyOS实战-ArkUI组件(Swiper)03-3013.鸿蒙HarmonyOS实战-ArkUI组件(Button)04-0114.鸿蒙HarmonyOS实战-ArkUI组件(Radio)04-0215.鸿蒙HarmonyOS实战-ArkUI组件(Toggle)04-0216.鸿蒙HarmonyOS实战-ArkUI组件(Progress)04-0317.鸿蒙HarmonyOS实战-ArkUI组件(Text/Span)04-0318.鸿蒙HarmonyOS实战-ArkUI组件(TextInput/TextArea)04-0719.鸿蒙HarmonyOS实战-ArkUI组件(CustomDialog)04-0820.鸿蒙HarmonyOS实战-ArkUI组件(Video)04-0921.鸿蒙HarmonyOS实战-ArkUI组件(Popup)04-1022.鸿蒙HarmonyOS实战-ArkUI组件(Menu)04-1123.鸿蒙HarmonyOS实战-ArkUI组件(页面路由)04-1224.鸿蒙HarmonyOS实战-ArkUI组件(Navigation)04-1325.鸿蒙HarmonyOS实战-ArkUI组件(Tabs)04-1526.鸿蒙HarmonyOS实战-ArkUI组件(Image)04-1627.鸿蒙HarmonyOS实战-ArkUI组件(Shape)04-1728.鸿蒙HarmonyOS实战-ArkUI组件(Canvas)04-1829.鸿蒙HarmonyOS实战-ArkUI动画(布局更新动画)04-1930.鸿蒙HarmonyO实战-ArkUI动画(组件内转场动画)04-2031.鸿蒙HarmonyOS实战-ArkUI动画(放大缩小视图)04-2332.鸿蒙HarmonyOS实战-ArkUI动画(页面转场动画)04-2433.鸿蒙HarmonyOS实战-ArkUI事件(触屏事件)04-2534.鸿蒙HarmonyOS实战-ArkUI事件(键鼠事件)04-2635.鸿蒙HarmonyOS实战-ArkUI事件(焦点事件)05-0736.鸿蒙HarmonyOS实战-ArkUI事件(手势方法)05-0837.鸿蒙HarmonyOS实战-ArkUI事件(单一手势)05-0938.鸿蒙HarmonyOS实战-ArkUI事件(组合手势)05-1239.鸿蒙HarmonyOS实战-Stage模型(概述和组件配置)05-1340.鸿蒙HarmonyOS实战-Stage模型(UIAbility组件)05-1441.鸿蒙HarmonyOS实战-Stage模型(ExtensionAbility组件)05-1542.鸿蒙HarmonyOS实战-Stage模型(服务卡片介绍和运行机制)05-1643.鸿蒙HarmonyOS实战-Stage模型(服务卡片的模块和创建)05-1744.鸿蒙HarmonyOS实战-Stage模型(开发卡片页面)05-1845.鸿蒙HarmonyOS实战-Stage模型(开发卡片事件)05-2046.鸿蒙HarmonyOS实战-Stage模型(卡片数据交互)05-2147.鸿蒙HarmonyOS实战-Stage模型(AbilityStage组件容器)05-2248.鸿蒙HarmonyOS实战-Stage模型(应用上下文Context)05-2349.鸿蒙HarmonyOS实战-Stage模型(信息传递载体Want)05-24
    50.鸿蒙HarmonyOS实战-Stage模型(进程模型)05-25
    51.鸿蒙HarmonyOS实战-Stage模型(线程模型)05-2752.鸿蒙HarmonyOS实战-Web组件(基本使用和属性)05-2853.鸿蒙HarmonyOS实战-Web组件(前端函数和应用侧函数相互调用)05-29
    收起

    🚀前言

    进程是计算机中运行的程序的实例。它是操作系统对正在执行的程序的一种抽象概念。每个进程都有自己的独立内存空间、运行状态和执行上下文。进程可以包含一个或多个线程,每个线程可以独立执行一部分任务。操作系统通过分配和管理进程资源来实现多任务和并发执行。进程之间可以通过进程间通信机制进行数据交换和协作。

    🚀一、进程模型

    🔎1.概述

    在HarmonyOS中,应用的进程模型是基于多线程的。每个应用会运行在一个独立的进程中,并且应用中的所有UIAbility(即应用的界面部分)会运行在同一个进程中。这意味着应用中的不同界面之间可以通过共享内存和消息传递等方式进行通信。

    另外,HarmonyOS中的WebView拥有独立的渲染进程。这是为了提高浏览器的安全性和稳定性。通过将WebView的渲染过程与应用的进程隔离开来,避免了恶意网页对应用进行攻击或造成应用崩溃的情况。

    HarmonyOS的进程模型是基于多线程的,应用的界面部分运行在同一个进程中,而WebView拥有独立的渲染进程。这样可以提高应用的安全性和稳定性。

    🚀二、公共事件简介

    🔎1.概述

    HarmonyOS的公共事件服务(Common Event Service,CES)是一种机制,可以为应用程序提供订阅、发布和退订公共事件的能力。这个服务使得不同应用程序之间可以进行事件的交互和通信。

    通过CES,应用程序可以定义自己的事件,并将这些事件发布到系统的事件总线上。其他应用程序可以通过订阅感兴趣的事件来接收相关的通知。当有事件发生时,发布者会将事件信息发送到事件总线,然后事件总线会将这些信息传递给所有订阅者。

    CES提供了一种可靠的事件通信机制,可以在不同的应用程序之间进行事件的交互。这样,应用程序可以更方便地实现功能的集成和扩展。

    在CES中,事件是以消息的形式进行传递的,可以包含任意类型的数据。应用程序可以根据需要定义不同类型的事件,并指定事件的触发条件和处理方式。

    公共事件从系统角度可分为:系统公共事件和自定义公共事件

    image

    公共事件按发送方式可分为:无序公共事件、有序公共事件和粘性公共事件

    image

    image

    🔎2.订阅

    订阅是指在发布者-订阅者模式中,订阅者向发布者注册,以接收发布者发送的消息或事件。订阅者可以选择订阅他们感兴趣的特定主题或类型的消息。

    在发布订阅模式中,订阅者需要执行以下步骤来进行订阅:

    1. 创建一个订阅者对象或函数,用于处理接收到的消息或事件。
    2. 向发布者注册订阅者。这通常通过调用发布者的订阅方法,并传递订阅者对象或函数作为参数来完成。订阅方法可能会要求提供订阅的主题或类型。
    3. 订阅者被添加到发布者的订阅列表中,以便在有新消息或事件时通知订阅者。
    4. 当发布者发布消息或触发事件时,订阅者会收到通知,并执行相应的处理逻辑。

    订阅者可以随时选择取消订阅,以停止接收发布者的消息。取消订阅通常通过调用发布者的取消订阅方法,并传递订阅者对象或函数作为参数来完成。

    通过发布订阅模式,订阅者可以实现松耦合的消息传递,提高系统的可扩展性和灵活性。

    🦋2.1 公共事件订阅概述

    动态订阅是在应用运行时,动态地调用公共事件订阅的API来实现对公共事件的订阅。这种方式适用于需要根据业务逻辑动态决定是否订阅某个公共事件的情况。例如,一个电子商务应用可能在用户下单时订阅订单创建事件,但在取消订单时取消订阅。

    静态订阅是通过配置文件声明和实现继承自StaticSubscriberExtensionAbility的类来实现对公共事件的订阅。这种方式适用于需要一直订阅某个公共事件而不需要动态调整订阅的情况。例如,一个日志服务可能一直订阅用户登录事件,以记录用户的登录日志。

    无论是动态订阅还是静态订阅,订阅方都可以实现自己的业务逻辑来处理接收到的公共事件。例如,订阅方可以在接收到订单创建事件时,将订单信息保存到数据库中。通过订阅公共事件,应用可以实现不同模块之间的解耦和灵活的消息传递。

    🦋2.2 动态订阅公共事件

    注意需要申请权限

    import commonEventManager from '@ohos.commonEventManager'; 
    import Base from '@ohos.base';
    
    // 用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作
    let subscriber: commonEventManager.CommonEventSubscriber | null = null;
    // 订阅者信息
    let subscribeInfo: commonEventManager.CommonEventSubscribeInfo = {
      events: ["usual.event.SCREEN_OFF"], // 订阅灭屏公共事件
    }
    
    // 创建订阅者回调
    commonEventManager.createSubscriber(subscribeInfo, (err: Base.BusinessError, data: commonEventManager.CommonEventSubscriber) => {
      if (err) {
        console.error(`Failed to create subscriber. Code is ${err.code}, message is ${err.message}`);
        return;
      }
      console.info('Succeeded in creating subscriber.');
      subscriber = data;
      // 订阅公共事件回调
    })
    
    // 订阅公共事件回调
    if (subscriber !== null) {
      commonEventManager.subscribe(subscriber, (err: Base.BusinessError, data: commonEventManager.CommonEventData) => {
        if (err) {
          console.error(`Failed to subscribe common event. Code is ${err.code}, message is ${err.message}`);
          return;
        }
      })
    } else {
      console.error(`Need create subscriber`);
    }
    

    🦋2.3 静态订阅公共事件(仅对系统应用开放)

    1、声明一个静态订阅者,首先需要在工程中新建一个ExtensionAbility, 该ExtensionAbility从StaticSubscriberExtensionAbility派生,其代码实现如下:

    import StaticSubscriberExtensionAbility from '@ohos.application.StaticSubscriberExtensionAbility'
    
    export default class StaticSubscriber extends StaticSubscriberExtensionAbility {
        onReceiveEvent(event) {
            console.log('onReceiveEvent, event:' + event.event);
        }
    }
    

    2、配置文件

    {
      "module": {
        ......
        "extensionAbilities": [
          {
            "name": "StaticSubscriber",
            "srcEntrance": "./ets/StaticSubscriber/StaticSubscriber.ts",
            "description": "$string:StaticSubscriber_desc",
            "icon": "$media:icon",
            "label": "$string:StaticSubscriber_label",
            "type": "staticSubscriber",
            "visible": true,
            "metadata": [
              {
                "name": "ohos.extension.staticSubscriber",
                "resource": "$profile:subscribe"
              }
            ]
          }
        ]
        ......
      }
    }
    

    image

    metadata指向的二级配置文件的通常形式如下:

    {
      "commonEvents": [
        {
          "name": "xxx",
          "permission": "xxx",
          "events":[
            "xxx"
          ]
        }
      ]
    }
    

    image

    修改设备系统配置文件 /etc/static_subscriber_config.json,将静态订阅应用者的包名添加至该json文件中即可

    {
        "xxx",
        "ohos.extension.staticSubscriber",
        "xxx"
    }
    

    🦋2.3 取消动态订阅公共事件

    import commonEvent from '@ohos.commonEventManager';
    // subscriber为订阅事件时创建的订阅者对象
    if (subscriber !== null) {
        commonEvent.unsubscribe(subscriber, (err) => {
            if (err) {
                console.error(`[CommonEvent] UnsubscribeCallBack err=${JSON.stringify(err)}`)
            } else {
                console.info(`[CommonEvent] Unsubscribe`)
                subscriber = null
            }
        })
    }
    

    🔎3.发布

    在发布订阅模型中,发布是指将消息发送到主题中。发布者通常不需要关心谁订阅了它们的消息,也不需要知道是否有订阅者。发布者只需要将消息发送到主题,然后该主题负责将消息传递给所有订阅者。

    发布订阅模型可以用于实现异步通信,其中发布者和订阅者可以在互不干扰的情况下进行工作。发布者可以继续发布消息,而订阅者可以在需要时接收消息。

    🦋3.1 发布不携带信息的公共事件

    import commonEvent from '@ohos.commonEventManager';
    
    // 发布公共事件
    commonEvent.publish("usual.event.SCREEN_OFF", (err) => {
        if (err) {
            console.error(`[CommonEvent] PublishCallBack err=${JSON.stringify(err)}`);
        } else {
            console.info(`[CommonEvent] Publish success`);
        }
    })
    

    🦋3.2 发布携带信息的公共事件

    import commonEvent from '@ohos.commonEventManager';
    
    // 公共事件相关信息
    let options = {
        code: 1, // 公共事件的初始代码
        data: "initial data", // 公共事件的初始数据
    }
    
    // 发布公共事件
    commonEvent.publish("usual.event.SCREEN_OFF", options, (err) => {
        if (err) {
            console.error('[CommonEvent] PublishCallBack err=' + JSON.stringify(err));
        } else {
            console.info('[CommonEvent] Publish success')
        }
    })
    

    🚀写在最后

    • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
    • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
    • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
    • 更多鸿蒙最新技术知识点,请关注作者博客:https://t.doruo.cn/14DjR1rEY

    image

  • 相关阅读:
    4、Buffer
    解决springboot项目启动jar包中的携带先行版本号问题
    前端知识案例学习2-无缝滚动代码
    网络安全(黑客)自学
    网络虚拟化
    Springboot 是这样提高创建 docker 容器的效率的
    spring框架源码十五、BeanFactory创建子流程
    嵌入式属于人工智能吗?
    ukb进不去了是怎么回事?
    Doris 导出表结构或数据
  • 原文地址:https://www.cnblogs.com/shudaoshan/p/18213077
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号