鸿蒙 Stage模型-AbilityStage、Context、Want

打印 上一主题 下一主题

主题 1002|帖子 1002|积分 3006

前提:基于官网3.1/4.0文档。参考官网文档
基于Android开辟体系来进行比力和思考。(或有偏颇,自行斟酌)
  一、 AbilityStage

1.概念

   AbilityStage是一个Module级别的组件容器,应用的HAP在首次加载时会创建一个AbilityStage实例,可以对该Module进行初始化等操作。
AbilityStage与Module逐一对应,即一个Module拥有一个AbilityStage。
  类同Application
2.功能与使用

1. 设置

module.json5中:
  1. {
  2.   "module": {
  3.     "name": "entry",
  4.     "type": "entry",
  5.     "srcEntry": "./ets/myabilitystage/MyAbilityStage.ts",
  6.     ...
  7.   }
  8. }
复制代码
2.使用

  1. import AbilityStage from '@ohos.app.ability.AbilityStage';
  2. export default class MyAbilityStage extends AbilityStage {
  3.   onCreate() {
  4.     // 应用的HAP在首次加载的时,为该Module初始化操作
  5.   }
  6.   onAcceptWant(want) {
  7.     // 仅specified模式下触发
  8.     return "MyAbilityStage";
  9.   }
  10. }
复制代码
  

  • onCreate()生命周期回调:在开始加载对应Module的第一个UIAbility实例之前会先创建AbilityStage,并在AbilityStage创建完成之后执行其
    onCreate()生命周期回调。AbilityStage模块提供在Module加载的时候,关照开辟者,可以在此进行该Module的初始化(如资源预加载,线程创建等)能力。
  • onAcceptWant()事故回调:UIAbility指定实例模式(specified)启动时候触发的事故回调,具体使用请参见UIAbility启动模式综述。
  • onConfigurationUpdated()事故回调:当体系全局设置发生变更时触发的事故,体系语言、深淡色等,设置项目前均定义在Configuration类中。
  • onMemoryLevel()事故回调:当体系调解内存时触发的事故。
  二、Context

1.概念



2.功能与使用

与Android类似。
三、Want

1.概念

   Want是对象间信息通报的载体,可以用于应用组件间的信息通报。其使用场景之一是作为startAbility()的参数,包罗了指定的启动目标以及启动时需携带的相关数据,如bundleName和abilityName字段分别指明目标Ability所在应用的包名以及对应包内的Ability名称。当UIAbilityA启动UIAbilityB并必要传入一些数据给UIAbilityB时,Want可以作为一个载体将数据传给UIAbilityB。

类似Android中的Bundle。
  2.功能与使用

1.显式与隐式规则





通报的数据包罗参数:
deviceId、bundleName、moduleName、abilityName、uri、type、action、entities、flags、parameters。
其中abilityName指定了值则为显式规则,否则为隐式规则。
匹配规则偏向于正则表达式匹配规则、包罗关系。
2.action与entities

action
   表现调用方要执行的通用操作(如查看、分享、应用详情)
ACTION_HOME:启动应用入口组件的动作,必要和ENTITY_HOME配合使用;
ACTION_CHOOSE:选择当地资源数据,比方接洽人、相册等;
ACTION_VIEW_DATA:查看数据,当使用网址uri时,则表现显示该网址对应的内容。
ACTION_VIEW_MULTIPLE_DATA:发送多个数据记录的操作
  entities
   表现目标Ability的种别信息(如欣赏器、视频播放器),在隐式Want中是对action的补充。在隐式Want中,开辟者可定义该字段,来过滤匹配应用的种别,比方必须是欣赏器。在Want内声明entities字段表现盼望被调用方应用属于声明的种别。在被调用方应用设置文件skills字段内声明entites表现该应用支持的种别。
ENTITY_DEFAULT:默认种别无现实意义。
ENTITY_HOME:主屏幕有图标点击入口种别。
ENTITY_BROWSABLE:指示欣赏器种别。
  action ->action
entities -> intent-filter?
3.案例

1.显式跳转
  1. import common from '@ohos.app.ability.common';
  2. // ...
  3.   async explicitStartAbility() {
  4.     try {
  5.       // Explicit want with abilityName specified.
  6.       let want = {
  7.         deviceId: "",
  8.         bundleName: "com.example.myapplication",
  9.         abilityName: "calleeAbility"
  10.       };
  11.       let context = getContext(this) as common.UIAbilityContext;
  12.       await context.startAbility(want);
  13.       console.info(`explicit start ability succeed`);
  14.     } catch (error) {
  15.       console.info(`explicit start ability failed with ${error.code}`);
  16.     }
  17.   }
  18. // ...
复制代码
注意这里对调用方法使用了async和await。归根到底应该是使用了await导致整个方法是async。 startAbility是异步的的好理解,但是为什么要单独加上那个await修饰符呢?
2.隐式跳转
1.被调用放设置
  1. "skills": [
  2.   {
  3.     "entities": [
  4.       "entity.system.browsable"
  5.       // ...
  6.     ],
  7.     "actions": [
  8.         "ohos.want.action.viewData"
  9.         // ...
  10.     ],
  11.     "uris": [
  12.       {
  13.         "scheme": "https",
  14.         "host": "www.test.com",
  15.         "port": "8080",
  16.         // prefix matching
  17.         "pathStartWith": "query",
  18.         "type": "text/*"
  19.       },
  20.       {
  21.         "scheme": "http",
  22.         // ...
  23.       }
  24.       // ...
  25.     ]
  26.   },
  27. ]
复制代码

  • 调用方调用
  1.     async implicitStartAbility() {
  2.         try {
  3.             let want = {
  4.                 // uncomment line below if wish to implicitly query only in the specific bundle.
  5.                 // bundleName: "com.example.myapplication",
  6.                 "action": "ohos.want.action.viewData",
  7.                 // entities can be omitted.
  8.                 "entities": [ "entity.system.browsable" ],
  9.                 "uri": "https://www.test.com:8080/query/student",
  10.                 "type": "text/plain"
  11.             }
  12.             let context = getContext(this) as common.UIAbilityContext;
  13.             await context.startAbility(want)
  14.             console.info(`explicit start ability succeed`)
  15.         } catch (error) {
  16.             console.info(`explicit start ability failed with ${error.code}`)
  17.         }
  18.      }
复制代码
匹配规则为链式,顺序为:action->entities->urls->type,满足前序条件才能进行到后续匹配。
四、总结

AbilityStage->Application
Context->Contenxt
Want->Bundle

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

花瓣小跑

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表