天天看點

Ability入門

Ability入門

Ability在英文中是能力的意思,在這裡是指應用所具備能力的抽象,同時是應用程式的重要組成部分。一個應用可以包含一個或多個FA/PA,其中,FA有UI界面,提供與使用者互動的能力;而PA無UI界面,提供背景運作任務的能力以及統一的資料通路抽象。基于FA/PA開發的應用,能夠實作特定的業務功能,支援跨裝置排程與分發,為使用者提供一緻、高效的應用體驗。

目前Ability架構模型具有兩種形态。

  • 第一種形态為FA模型。支援API 8及其更早版本。
  • 第二種形态為Stage模型。從API 9開始支援。

這裡我們就拿API 8及其更早版本中的FA來說。學習能夠看得見的Ability内部的頁面跳轉和Ability之間的頁面跳轉。激發大家的學習興趣。

先來預覽一下今天的一個效果。

Ability入門

接下來,我們建立一個項目AbilityDemo

Ability入門

等待依賴加載完成之後

先進行一個簽名

Ability入門

這個時候,就可以安裝到dayu200上

接下來就到今天最關鍵的的學習環節了

1.Ability内頁面跳轉(不帶參數)

  • 在eTS目錄如下,pages目錄下有index.ets和second.ets;
  • Ability入門

實作:

在index.ets中引入router子產品;

import router from '@system.router';

@Entry
@Component
struct Index {
  @State message: string = 'Ability内頁面跳轉(不帶參數)'

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(20)
          .fontWeight(FontWeight.Bold).onClick(()=>{

          // 跳轉按鈕綁定onClick事件,點選時跳轉到第二頁
          router.push({uri:"pages/second"})
        })


      }
      .width('100%')
    }
    .height('100%')
  }
}      

為按鈕添加點選事件,點選後跳轉到second頁面,使用router.push實作跳轉;

2.Ability内頁面跳轉(攜帶參數)

在eTS目錄如下,pages目錄下有index.ets和third.ets;

Ability入門

我們這次用Navigator元件,來攜帶參數跳轉

import router from '@system.router';

@Entry
@Component
struct Index {

  @State content: object = { name: '我是上一個頁面攜帶的資料' }

  build() {
    Row() {
      Column() {
        Navigator({ target: 'pages/third', type: NavigationType.Push }) {
          Text("Ability内頁面跳轉(攜帶參數)").fontSize(20)
            .width('100%').textAlign(TextAlign.Center)
        }
        //跳轉時要同時傳遞到目标頁面的資料,可在目标頁面使用router.getParams()獲得。
        .params({ text: this.content })
      }
    }.width('100%').height('100%')

  }
}      

Third.page

import router from '@system.router'

@Entry
@Component
struct Thrid {
  // 通過router接收上一個頁面傳遞的參數
  // @ts-ignore
  @State text: any = router.getParams().text
  build() {
    Row() {
      Column() {
        Text(this.text['name'])
          .fontSize(50)
          .fontWeight(FontWeight.Bold).onClick(() => {
          router.back()
        })
      }
      .width('100%')
    }
    .height('100%')
  }
}      

3.跳轉到指定Ability首頁

  • 建立Ability,名為SecondAbility,在ets目錄下右鍵建立New->Ability->Empty Page Ability(eTS);
Ability入門

目錄如圖所示:

Ability入門
  1. 在MainAbility/pages/index.ets中引入featureAbility子產品;
import featureAbility from '@ohos.ability.featureAbility';      
  1. 在MainAbility/pages/index.ets中添加按鈕,并為按鈕添加文本、樣式和點選事件,點選後跳轉到SecondAbility的index頁面,通過featureAbility.startAbility實作,調用featureAbility.startAbility時,這裡參數want裡主要傳遞bundleName和abilityName;詳情請參看啟動本地PageAbility。點選按鈕觸發點選事件後會預設跳轉到MainAbility2的index頁面。
import featureAbility from '@ohos.ability.featureAbility';
Text("跳轉到指定Ability首頁")
          .fontSize(20)
          .fontWeight(FontWeight.Bold).onClick(() => {
          //啟動Ability
          let str = {
            "want": {
              //裝置Id,本機預設為空
              deviceId:"",
              //app名稱,在config.json的bundleName
              bundleName:"com.jianguo.abilitydemo",
              //頁面名稱,注意包名
              abilityName:"com.jianguo.entry.SecondAbility"

            },
          };
          featureAbility.startAbility(str)
            .then((data) => {
              console.info('Operation successful. Data: ' + JSON.stringify(data))
            }).catch((error) => {
            console.error('Operation failed. Cause: ' + JSON.stringify(error));
          })
        })      

然後我對上面的參數做個說明

  • deviceId:進行說明本機預設為空,
  • bundleName:在 config.json 的 bundleName
  • abilityName:頁面名稱,注意包名

4.跳轉到指定Ability指定頁

  • 在名為SecondAbility中,建立second.ets
Ability入門
import featureAbility from '@ohos.ability.featureAbility';
Text("跳轉到指定Ability頁面")
          .fontSize(20)
          .fontWeight(FontWeight.Bold).onClick(() => {
          //啟動Ability
          let str = {
            "want": {
              //裝置Id,本機預設為空
              deviceId:"",
              //app名稱,在config.json的bundleName
              bundleName:"com.jianguo.abilitydemo",
              //頁面名稱,注意包名
              abilityName:"com.jianguo.abilitydemo.SecondAbility",
              parameters: {
                url: 'pages/second'
              }
            },
          };
          featureAbility.startAbility(str)
            .then((data) => {
              console.info('Operation successful. Data: ' + JSON.stringify(data))
            }).catch((error) => {
            console.error('Operation failed. Cause: ' + JSON.stringify(error));
          })
        })      

路徑src/main/ets/SecondAbility/pages/second.ets

import router from '@ohos.router';
@Entry
@Component
struct Second {
  @State message: string = '我是Ability的Second頁面'

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold).onClick(() => {
          router.back()
        })
      }
      .width('100%')
    }
    .height('100%')
  }
}      

好的,通過今天的整理,我們把Ability相關的一些技術點也做了一些了解,學到了四個小知識點。

下一期的内容,我會帶領大家實作遠端FA的啟動。

源碼位址

參考資料

[ Ability架構概述](zh-cn/application-dev/ability/ability-brief.md · OpenHarmony/docs - Gitee.com)

FA模型綜述