鴻蒙HarmonyOS實戰-ArkTS語言基礎類庫(通知)

蜀道山QAQ發表於2024-06-07

🚀前言

移動應用中的通知是指應用程式傳送給使用者的一種提示或提醒訊息。這些通知可以在使用者裝置的通知中心或狀態列中顯示,以提醒使用者有關應用程式的活動、事件或重要資訊。

移動應用中的通知可以分為兩種型別:本地通知和遠端通知。

本地通知是由應用程式自身發起的通知,不需要連線到遠端伺服器。應用程式可以根據特定條件或事件觸發本地通知,例如定時提醒、任務完成等。本地通知可以直接在裝置上顯示,即使應用程式未執行,使用者也能收到通知。

遠端通知是由遠端伺服器傳送給應用程式的通知。應用程式需要與遠端伺服器建立連線,以接收和處理遠端通知。遠端通知可以用於各種目的,如推送新聞、推廣促銷活動、提醒使用者更新等。

無論是本地通知還是遠端通知,移動應用中的通知通常都具有以下特點:

  1. 可定製性:應用程式可以自定義通知的內容、標題、圖示等,以便向使用者提供個性化的體驗。

  2. 互動性:通知可以包含操作按鈕或連結,使用者可以透過點選通知來執行特定的操作,如開啟應用、檢視詳情等。

  3. 靜默通知:某些通知可以以靜默模式傳送,即使用者不會收到任何視覺或聲音提示,但應用程式仍可以在後臺處理通知。

  4. 優先順序控制:應用程式可以為通知設定優先順序,以便在裝置上顯示不同的通知樣式或觸發不同的提示音。

🚀一、通知

🔎1.通知概述

🦋1.1 通知簡介

HarmonyOS應用可以透過通知介面傳送通知訊息。開發者可以使用該介面傳送各種型別的通知,包括普通通知、長文字通知、大圖通知等。終端使用者可以透過通知欄檢視通知內容,並進行相應操作,比如點選通知來開啟應用。

透過通知介面,開發者可以設定通知的標題、內容、圖示、優先順序等屬性。可以透過設定點選通知後的跳轉動作,實現點選通知開啟應用的功能。此外,開發者還可以透過設定通知的聲音、震動等效果,提升使用者體驗。

通知常見的使用場景:

  • 提醒使用者有待辦事項,如鬧鐘、日曆事件等。

  • 通知使用者裝置的狀態,如電量低、網路連線狀態等。

  • 提醒使用者有新的郵件、社交媒體訊息等。

  • 顯示其他應用的提醒、通知,如電話、音樂播放器、定時器等。

  • 顯示系統級別的通知,如系統更新、許可權請求等。

  • 提醒使用者有新的軟體更新、安全補丁等。

  • 通知使用者有新的活動、促銷等。

  • 提醒使用者有新的天氣預報、股票行情等。

  • 顯示其他應用的報警、警報等緊急通知。

HarmonyOS透過Advanced Notification Service(ANS)為應用程式提供通知管理服務。ANS支援多種通知型別,包括基礎型別通知和進度條型別通知。

基礎型別通知是一種簡單的通知樣式,用於顯示重要的文字資訊或簡短的通知內容。它可以包含標題、內容和圖示,使用者可以透過點選通知來執行相關操作。

進度條型別通知用於顯示任務進度或下載進度等資訊。它除了包含基礎型別通知的內容外,還可以新增一個進度條,以便使用者瞭解任務的進度情況。

🦋1.2 通知業務流程

通知子系統是一箇中介軟體,負責接收來自通知傳送端的通知訊息,並將這些訊息分發給訂閱端。它起到了訊息排程和分發的作用,實現了釋出-訂閱模式。

通知傳送端是產生通知訊息的元件,可以是應用程式、系統模組等。它負責生成通知訊息,並透過IPC通訊機制將訊息傳送到通知子系統。

通知訂閱端是接收通知訊息的元件,可以是應用程式、監控工具等。它透過訂閱通知子系統,接收特定型別的通知訊息。

整個通知業務流程如下:

  1. 通知傳送端生成一條通知訊息,包括通知的型別、內容等。
  2. 通知傳送端透過IPC通訊機制將通知訊息傳送到通知子系統。
  3. 通知子系統接收到通知訊息後,根據訊息的型別和訂閱端的訂閱情況,將訊息分發給相應的訂閱端。
  4. 訂閱端接收到通知訊息後,進行相應的處理,比如展示通知內容、觸發某些操作等。

透過通知子系統的中介軟體架構,可以實現高效的通知訊息分發。通知傳送端和訂閱端之間解耦,可以獨立開發和部署,提高了系統的可擴充套件性和可維護性。同時,透過訂閱機制,訂閱端可以選擇性地接收感興趣的通知訊息,提高了系統的靈活性。

image

🔎2.釋出通知

🦋2.1 釋出基礎型別通知

基礎型別通知可以用來傳送各種型別的通知,包括簡訊息、提示資訊和廣告推送等。它們可以包含普通文字、長文字、多行文字和圖片等。

image

例如,你可以傳送一條包含簡短文字的通知來提醒使用者某個事件即將發生,或者傳送一條包含長文字的通知來提供詳細的資訊。此外,你還可以傳送一條包含多行文字的通知,每行顯示一條資訊。如果需要顯示圖片,你可以傳送一條包含圖片的通知。基礎型別通知非常靈活,可以根據具體需求來進行設定。

☀️2.1.1 介面說明

image

☀️2.1.2 開發步驟

在HarmonyOS中,NotificationRequest類是用於建立通知的一個重要類。透過NotificationRequest類,可以設定通知的各種屬性,如標題、內容、圖示、聲音、震動等。

🌈2.1.2.1 普通文字型別
import NotificationManager from '@ohos.notificationManager';
let notificationRequest = {
  id: 1,
  content: {
    contentType: NotificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT, // 普通文字型別通知
    normal: {
      title: 'test_title',
      text: 'test_text',
      additionalText: 'test_additionalText',
    }
  }
}

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

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            NotificationManager.publish(notificationRequest, (err) => {
              if (err) {
                console.error(`[ANS] failed to publish, error[${err}]`);
                return;
              }
              console.info(`[ANS] publish success`);
            });
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

image

🌈2.1.2.2 長文字型別通知
import NotificationManager from '@ohos.notificationManager';
let notificationRequest = {
  id: 1,
  content: {
    contentType: NotificationManager.ContentType.NOTIFICATION_CONTENT_LONG_TEXT, // 長文字型別通知
    longText: {
      title: 'test_title',
      text: 'test_text',
      additionalText: 'test_additionalText',
      longText: 'test_longText',
      briefText: 'test_briefText',
      expandedTitle: 'test_expandedTitle',
    }
  }
}
// 釋出通知
NotificationManager.publish(notificationRequest, (err) => {
  if (err) {
    console.error(`[ANS] failed to publish, error[${err}]`);
    return;
  }
  console.info(`[ANS] publish success`);
});
@Entry
@Component
struct Index {
  @State message: string = 'Hello World'

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

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

image

🌈2.1.2.3 多行文字型別通知
import NotificationManager from '@ohos.notificationManager';
let notificationRequest = {
  id: 1,
  content: {
    contentType: NotificationManager.ContentType.NOTIFICATION_CONTENT_MULTILINE, // 多行文字型別通知
    multiLine: {
      title: 'test_title',
      text: 'test_text',
      briefText: 'test_briefText',
      longTitle: 'test_longTitle',
      lines: ['line_01', 'line_02', 'line_03', 'line_04'],
    }
  }
}

// 釋出通知
NotificationManager.publish(notificationRequest, (err) => {
  if (err) {
    console.error(`[ANS] failed to publish, error[${err}]`);
    return;
  }
  console.info(`[ANS] publish success`);
});
@Entry
@Component
struct Index {
  @State message: string = 'Hello World'

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

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

image

🌈2.1.2.4 圖片型別通知
import NotificationManager from '@ohos.notificationManager';
import image from '@ohos.multimedia.image';
// 圖片構造
const color = new ArrayBuffer(60000);
let bufferArr = new Uint8Array(color);
for (var i = 0; i<bufferArr.byteLength;i++) {
  bufferArr[i++] = 60;
  bufferArr[i++] = 20;
  bufferArr[i++] = 220;
  bufferArr[i] = 100;
}
let opts = { editable:true, pixelFormat:"ARGB_8888", size: {height:100, width : 150}};

image
  // @ts-ignore
  .createPixelMap(color, opts)
  .then(async (pixelmap) => {
    await pixelmap.getImageInfo().then(imageInfo => {
      console.log("=====size: ====" + JSON.stringify(imageInfo.size));
    }).catch(err => {
      console.error("Failed to obtain the image pixel map information." + JSON.stringify(err));
      return;
    })
    let notificationRequest = {
      id: 1,
      content: {
        contentType: NotificationManager.ContentType.NOTIFICATION_CONTENT_PICTURE,
        picture: {
          title: 'test_title',
          text: 'test_text',
          additionalText: 'test_additionalText',
          picture: pixelmap,
          briefText: 'test_briefText',
          expandedTitle: 'test_expandedTitle',
        }
      },
    }
    // 傳送通知
    NotificationManager.publish(notificationRequest, (err) => {
      if (err) {
        console.error(`[ANS] failed to publish, error[${err}]`);
        return;
      }
      console.info(`[ANS] publish success `);
    });
  }).catch(err=>{
    console.error('create pixelmap failed =========='+ JSON.stringify(err));
    return;
  })

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

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

          })

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

image

🦋2.2 釋出進度條型別通知

☀️2.2.1 介面說明

image

☀️2.2.2 開發步驟
import NotificationManager from '@ohos.notificationManager';
NotificationManager.isSupportTemplate('downloadTemplate').then((data) => {
  console.info(`[ANS] isSupportTemplate success`);
  let isSupportTpl: boolean = data; // isSupportTpl的值為true表示支援支援downloadTemplate模板類通知,false表示不支援
  // ...
}).catch((err) => {
  console.error(`[ANS] isSupportTemplate failed, error[${err}]`);
});

let template = {
  name:'downloadTemplate',
  data: {
    title: '標題:',
    fileName: 'music.mp4',
    progressValue: 30,
    progressMaxValue:100,
  }
}
//構造NotificationRequest物件
let notificationRquest = {
  id: 1,
  slotType: NotificationManager.SlotType.OTHER_TYPES,
  template: template,
  content: {
    contentType: NotificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT,
    normal: {
      title: template.data.title + template.data.fileName,
      text: "sendTemplate",
      additionalText: "30%"
    }
  },
  deliveryTime: new Date().getTime(),
  showDeliveryTime: true
}
NotificationManager.publish(notificationRquest).then(() => {
  console.info(`[ANS] publish success `);
}).catch((err) => {
  console.error(`[ANS] failed to publish, error[${err}]`);
});

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

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

          })

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

image

🦋2.3 為通知新增行為意圖

WantAgent是HarmonyOS提供的一種功能,它允許開發者封裝行為意圖。行為意圖主要用於拉起指定的應用元件或釋出公共事件等。在HarmonyOS中,我們可以透過通知的方式將WantAgent從釋出方傳遞給接收方,從而在接收方觸發WantAgent中指定的意圖。

舉個例子,假設有一個應用釋出一個通知訊息,通常希望使用者能夠透過點選通知欄來開啟目標應用元件。為了實現這個目標,開發者可以將WantAgent封裝到通知訊息中。當系統接收到帶有WantAgent的通知訊息時,使用者點選通知欄時會觸發WantAgent中指定的意圖,從而開啟目標應用元件。

為了實現通知中的行為意圖,應用需要嚮應用元件管理服務(AMS)申請WantAgent,並將其與其他通知資訊一起傳送給桌面。當使用者在桌面通知欄上點選通知時,系統會觸發WantAgent的動作,從而實現目標應用元件的開啟。

image

☀️2.3.1 介面說明

image

☀️2.3.2 開發步驟
import NotificationManager from '@ohos.notificationManager';
import wantAgent from '@ohos.app.ability.wantAgent';

let wantAgentObj = null; // 用於儲存建立成功的wantAgent物件,後續使用其完成觸發的動作。

// 透過WantAgentInfo的operationType設定動作型別。
let wantAgentInfo = {
  wants: [
    {
      deviceId: '',
      bundleName: 'com.example.test',
      abilityName: 'com.example.test.MainAbility',
      action: '',
      entities: [],
      uri: '',
      parameters: {}
    }
  ],
  operationType: wantAgent.OperationType.START_ABILITY,
  requestCode: 0,
  wantAgentFlags:[wantAgent.WantAgentFlags.CONSTANT_FLAG]
}

// // wantAgentInfo
// let wantAgentInfo = {
//   wants: [
//     {
//       action: 'event_name', // 設定事件名。
//       parameters: {},
//     }
//   ],
//   operationType: wantAgent.OperationType.SEND_COMMON_EVENT,
//   requestCode: 0,
//   wantAgentFlags: [wantAgent.WantAgentFlags.CONSTANT_FLAG],
// }

// 建立WantAgent
wantAgent.getWantAgent(wantAgentInfo, (err, data) => {
  if (err) {
    console.error('[WantAgent]getWantAgent err=' + JSON.stringify(err));
  } else {
    console.info('[WantAgent]getWantAgent success');
    wantAgentObj = data;
  }
});
// 構造NotificationRequest物件
let notificationRequest = {
  content: {
    contentType: NotificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT,
    normal: {
      title: 'Test_Title',
      text: 'Test_Text',
      additionalText: 'Test_AdditionalText',
    },
  },
  id: 1,
  label: 'TEST',
  //wantAgent: wantAgentObj,//好像報錯
}
// 通知傳送
NotificationManager.publish(notificationRequest, (err) => {
  if (err) {
    console.error(`[ANS] failed to publish, error[${err}]`);
    return;
  }
  console.info(`[ANS] publish success `);
});

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

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

          })

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

image

🚀寫在最後

  • 如果你覺得這篇內容對你還蠻有幫助,我想邀請你幫我三個小忙:
  • 點贊,轉發,有你們的 『點贊和評論』,才是我創造的動力。
  • 關注小編,同時可以期待後續文章ing🚀,不定期分享原創知識。
  • 更多鴻蒙最新技術知識點,請關注作者部落格:https://t.doruo.cn/14DjR1rEY

image

相關文章