鴻蒙中存在一些無感監聽,這些監聽經過系統API封裝使用很簡單,但是對實際業務開發中有很重要,例如埋點業務、數據統計、行為上報、切面攔截等。
Navigation的頁面切換
在鴻蒙中Navigation被用來作為路由棧進行頁面跳轉,如果你想知道頁面的路由棧,以及前后切換的頁面,可以通過官方提供的無感監聽的頁面切換navDestinationSwitch。
private _navDestinationListener() {this.uiContext?.getUIObserver().on('navDestinationSwitch', (info: uiObserver.NavDestinationSwitchInfo) => {let to = info.to;if (to != 'navBar') {let navName = `${to.name.toString()}#${to.navDestinationId}`;}});}
this.uiContext?.getUIObserver().off('navDestinationSwitch');


點擊事件的監聽
通過對系統控件設置customProperty,可以通過didClick進行點擊事件攔截,相當于對全部的系統控件可以hook處理。
@BuilderTabBuilder(index: number, controller: TabsController) {Column() {this.CanvasComponent(index, this.getCanvasRenderingContext())}.onClick(() => {}).layoutWeight(1).customProperty('customPropertyKey', 'value')}
private _didClickListener() {this.uiContext?.getUIObserver().on('didClick', (event: GestureEvent, frameNode?: FrameNode) => {if (frameNode == null) {return;}frameNode.getCustomProperty('customPropertyKey')});}
this.uiContext?.getUIObserver().off('didClick');
�

監聽TabContent頁面的切換事件
在鴻蒙中頁簽Tabs控件的使用頻率比較高,如果想知道哪個子TabContent被點擊了,就可以使用監聽TabContent頁面的切換事件。
private _tabContentUpdateListener() {this.uiContext?.getUIObserver().on('tabContentUpdate', (info: uiObserver.TabContentInfo) => {if (info.state != uiObserver.TabContentState.ON_SHOW) {return;}this._handleContentUpdateEvent(info.id, info.uniqueId, info.index, info.tabContentUniqueId, true);let frameNode = this.uiContext?.getFrameNodeByUniqueId(info.tabContentUniqueId);});}
this.uiContext?.getUIObserver().off('tabContentUpdate');

Aspect插樁能力
Aspect類用于封裝提供切面能力(Aspect Oriented Programming,簡寫AOP)的接口,這些接口可以用來對類方法進行前后插樁或者替換實現。
在指定的類對象的原方法執行前插入一個函數。addBefore接口執行完成后,都會先執行插入的函數邏輯,再執行指定類對象的原方法。
在指定的類方法執行后插入一段邏輯。最終返回值是插入函數執行后的返回值。


通過插樁處理,在彈框前后做一些邏輯,例如在彈框前后設置變量,就可以判斷彈框是否有觸發。
util.Aspect.addBefore(CustomDialogController, 'open', false, () => {AppStorage.setOrCreate(BusinessUseConstant.CUSTOMDIALOG_ISOPEN, true)});util.Aspect.addBefore(CustomDialogController, 'close', false, () => {AppStorage.setOrCreate(BusinessUseConstant.CUSTOMDIALOG_ISOPEN, false)});
