天天看點

OpenHarmony如何啟動FA(本地和遠端)

OpenHarmony如何啟動FA(本地和遠端)

啟動本地裝置FA

首先建立一個項目

如圖所示:

OpenHarmony如何啟動FA(本地和遠端)

點選finish即可

然後我們接下來先進行一些基礎設定

我們要在DAYU200開發闆上運作這個執行個體,是以要做一個簽名設定

點選File--- Project Struct,

OpenHarmony如何啟動FA(本地和遠端)

然後點選Signing Configs 完成簽名設定

OpenHarmony如何啟動FA(本地和遠端)

點選ok就會完成自動簽名。到了這兒,我們的第一步也算是完成了,接下來我們看一下下一步如何操作

回到我們今天的主題,我們是要啟動本地的另一個FA,但是目前隻有一個,是以我們這個時候需要再建立一個

在entry子產品依次點選New-Ability-PageAbility,就可以建立另一個FA,我們命名為SecondAbility

OpenHarmony如何啟動FA(本地和遠端)
OpenHarmony如何啟動FA(本地和遠端)

如下圖所示,我們已經建立成功

OpenHarmony如何啟動FA(本地和遠端)

修改SecondAbility中的預設message

@State message: string = 'SecondAbility'      

到這兒我們的第二步就算完成了

由于我們啟動的是本地的FA,後邊為了差別啟動遠端FA,是以我們需要對檔案進行一個重命名,這樣友善我們認識。

我們點選MainAbility‘中的index.ets,右擊進行重命名

OpenHarmony如何啟動FA(本地和遠端)

完成以上的步驟,編輯器會幫助我們對onfig.json中對項目進行重構

{
  "app": {
    "vendor": "example",
    "bundleName": "com.jianguo.openharmony",
    "version": {
      "code": 1000000,
      "name": "1.0.0"
    }
  },
  "deviceConfig": {},
  "module": {
    "mainAbility": ".MainAbility",
    "deviceType": [
      "phone",
      "tablet"
    ],
    "abilities": [
      {
        "skills": [
          {
            "entities": [
              "entity.system.home"
            ],
            "actions": [
              "action.system.home"
            ]
          }
        ],
        "orientation": "unspecified",
        "visible": true,
        "srcPath": "MainAbility",
        "name": ".MainAbility",
        "srcLanguage": "ets",
        "icon": "$media:icon",
        "description": "$string:MainAbility_desc",
        "formsEnabled": false,
        "label": "$string:MainAbility_label",
        "type": "page",
        "launchType": "standard"
      },
      {
        "orientation": "unspecified",
        "srcPath": "SecondAbility",
        "name": ".SecondAbility",
        "srcLanguage": "ets",
        "icon": "$media:icon",
        "description": "$string:SecondAbility_desc",
        "formsEnabled": false,
        "label": "$string:SecondAbility_label",
        "type": "page",
        "launchType": "standard"
      }
    ],
    "distro": {
      "moduleType": "entry",
      "installationFree": false,
      "deliveryWithInstall": true,
      "moduleName": "entry"
    },
    "package": "com.example.entry",
    "srcPath": "",
    "name": ".entry",
    "js": [
      {
        "mode": {
          "syntax": "ets",
          "type": "pageAbility"
        },
        "pages": [
          "pages/start_local_fa"
        ],
        "name": ".MainAbility",
        "window": {
          "designWidth": 720,
          "autoDesignWidth": false
        }
      },
      {
        "mode": {
          "syntax": "ets",
          "type": "pageAbility"
        },
        "pages": [
          "pages/index"
        ],
        "name": ".SecondAbility",
        "window": {
          "designWidth": 720,
          "autoDesignWidth": false      

接下來我們就看一下最關鍵的一步,如何啟動本地FA

我們可以利用一個button按鈕來對其進行跳操作

最主要的就是onclick裡面的事件

如下圖所示:

使用的時候注意導入包:

import featureAbiltty from '@ohos.ability.featureAbility'      
featureAbiltty.startAbility({
           want:
           {
             //裝置Id,本機預設為空
             deviceId:"",
             //app名稱,在config.json的bundleName
             bundleName:"com.jianguo.openharmony",
             //頁面名稱,注意包名
             abilityName:"com.example.entry.SecondAbility"      

然後我對上面的

  • deviceId:進行說明本機預設為空,
  • bundleName:在config.json的bundleName
  • abilityName:頁面名稱,注意包名
OpenHarmony如何啟動FA(本地和遠端)

然後我們在DATU20運作

發現可以跳轉,那麼我們就實作了這個功能

跨裝置啟動FA

接下來我們看一下如何啟動遠端的deviceId

在這之前,我們需要做的事就是,在config.json配置權限

非敏感權限在這兒定義就好,如果是敏感權限,就要在運作時發送彈窗的形式去處理。

"reqPermissions": [
      {
        "name": "ohos.permission.DISTRIBUTED_DATASYNC"
      }
    ]      
OpenHarmony如何啟動FA(本地和遠端)

遠端啟動注意點:

//裝置管理器
import deviceMAnager from'@ohos.distributedHardware.deviceManager'      
import featureAbilty from '@ohos.ability.featureAbility'
//裝置管理器
import deviceMAnager from '@ohos.distributedHardware.deviceManager'
//遠端app資訊
import bundle from '@ohos.bundle';
import abilityAccessCtrl from '@ohos.abilityAccessCtrl';

//動态申請權限,彈窗的形式,可以通用,注意修改兩個地方,一個是包名,一個是權限清單
async function requestPermision() {
  let array: Array<string> = ["ohos.permission.DISTRIBUTED_DATASYNC"]

  const appInfo = await bundle.getApplicationInfo("com.jianguo.openharmony", 0, 100)
  let tolenId = appInfo.accessTokenId;
  const atManger = abilityAccessCtrl.createAtManager();
  let requestPressions: Array<string> = []
  //周遊權限是否通過
  for (let i = 0;i < array.length; i++) {
    let result = await atManger.verifyAccessToken(tolenId, array[i]);
    if (result != abilityAccessCtrl.GrantStatus.PERMISSION_DENIED) {
      requestPressions.push(array[i]);
    }
  }
  if (requestPressions.length == 0 || requestPressions == []) {
    return;

  }

  let context = featureAbilty.getContext();
  context.requestPermissionsFromUser(requestPressions, 1, (data) => {

    console.info("XXXXXX data" + JSON.stringify(data))
  })
}

@Entry
@Component
struct Index {
  @State message: string = 'MainAbility'

  aboutToAppear() {
    //頁面即将顯示的時候處理,運作時發送彈窗的形式去處理
    requestPermision();


  }

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
        Button("跳轉遠端SecondAbility", {
          type: ButtonType.Capsule
        }).backgroundColor(Color.Orange).onClick((event: ClickEvent) => {


          deviceMAnager.createDeviceManager("com.jianguo.openharmony", (err, value) => {


            if (!err) {
              let devManager = value;
              //同步方式獲得可信任清單
              let deviceList = devManager.getTrustedDeviceListSync();
              featureAbilty.startAbility({
                want:
                {
                  //裝置Id,本機預設為空,這裡隻有兩台裝置,是以用數組[0]表示
                  deviceId: deviceList[0].deviceId,
                  //app名稱,在config.json的bundleName
                  bundleName: "com.jianguo.openharmony",
                  //頁面名稱,注意包名
                  abilityName: "com.example.entry.SecondAbility"


                }
              }).then((value) => {

                console.log("Succes Data" + JSON.stringify(value))
              }).catch((error) => {
                console.log("failed Data" + JSON.stringify(error))
              })
            }
          })


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