使用specified启动模式定制入口?

如题:使用specified启动模式定制入口?

阅读 517
1 个回答

功能场景描述及使用场景

specified启动模式为指定实例模式,有一些特殊场景,例如文档应用中每次新建文档希望都能新建一个文档实例,而重复打开的一个已保存的文档都是同一文档实例。

使用的核心API

specified启动模式

UIAbility.onNewWant

启动uiability的指定页面

核心代码

1、新建的SpecifiedAbility,将module.json5配置文件的launchType字段配置为specified。

2、在启动UIAbility之前,为该UIAbility实例指定一个唯一的字符串instanceKey,这样在调用startAbility()方法时,应用就可以根据指定的instanceKey来识别响应请求的UIAbility实例。在EntryAbility中,调用startAbility()方法时,可以在want参数中增加一个自定义参数,例如instanceKey,以此来区分不同的UIAbility实例。

import common from '@ohos.app.ability.common'
import Want from '@ohos.app.ability.Want';
import { BusinessError } from '@ohos.base';
 
@Entry
@Component
struct Index {
  
  getInstance(instance: String){
    return 'testKey' + instance;
  }
 
  redirectAbility(key: String){
    let context = getContext(this) as common.UIAbilityContext
 
    let want: Want = {
      deviceId: '',
      bundleName: 'com.example.customizedpagedemo',
      abilityName: 'SpecifiedAbility',
      parameters: {
        target: 'pages/specifiedAbility/SpecifiedDetail',
        instanceKey: key,
      },
    }
 
    context.startAbility(want).then(() => {
      console.info('startAbility succeeded')
    }).catch((err: BusinessError) => {
      console.error(`Failed to start ability. Code is ${err.code}, message is ${err.message}`);
    })
  }
 
  build() {
    Row() {
      Column() {
        Text('EntryAbility')
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
        Button('新建一个文档')
          .backgroundColor(Color.Green)
          .width(180)
          .margin({top: 20})
          .onClick(() => {
            this.redirectAbility(this.getInstance('new'));
          })
        Button('打开已保存的文档')
          .backgroundColor(Color.Green)
          .width(180)
          .margin({top: 20})
          .onClick(() => {
            this.redirectAbility(this.getInstance('old'));
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

3、调用startAbilit启动SpecifiedAbility之前,会先进入对应的MyAbilityStage的onAcceptWant()生命周期回调中,以获取该UIAbility实例的Key值。然后系统会自动匹配,如果存在与该UIAbility实例匹配的Key,则会启动与之绑定的UIAbility实例;否则会创建一个新的UIAbility实例。

import AbilityStage from '@ohos.app.ability.AbilityStage';
import Want from '@ohos.app.ability.Want';
import hilog from '@ohos.hilog';
 
export default class MyAbilityStage extends AbilityStage{
 
  onAcceptWant(want: Want): string {
    hilog.info(0x0000, 'testTag', '%{public}s', 'MyAbilityStage onAcceptWant', JSON.stringify(want) ?? '');
    if(want && want.abilityName === 'SpecifiedAbility'){
      if(want.parameters.instanceKey){
        return `SpecifiedAbilityInstance${want.parameters.instanceKey}`;
      }
    }
    return '';
  }
}

适配版本信息

IDE:DevEco Studio 4.1.1.300

SDK:HarmoneyOS 4.1.2.1

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进