鴻蒙應用程序開發(fā) 課件 第6、7章 公共事件與通知、線程管理與線程通信_第1頁
鴻蒙應用程序開發(fā) 課件 第6、7章 公共事件與通知、線程管理與線程通信_第2頁
鴻蒙應用程序開發(fā) 課件 第6、7章 公共事件與通知、線程管理與線程通信_第3頁
鴻蒙應用程序開發(fā) 課件 第6、7章 公共事件與通知、線程管理與線程通信_第4頁
鴻蒙應用程序開發(fā) 課件 第6、7章 公共事件與通知、線程管理與線程通信_第5頁
已閱讀5頁,還剩73頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第6章公共事件與通知引言本章學習目標理解HarmonyOS公共事件,并掌握調(diào)用公共事件處理接口及方法能在應用中發(fā)布、訂閱、退訂公共事件能在應用中使用各種類型的通知功能26.1公共事件6.1.1公共事件介紹4公共事件按照作用可分為:系統(tǒng)公共事件和自定義公共事件。系統(tǒng)公共事件是由系統(tǒng)發(fā)出的公共事件,例如APP安裝、更新、卸載等。自定義公共事件是由應用自定義并發(fā)出的公共事件,該類公共事件通過調(diào)用接口,并以廣播的形式發(fā)布出去。系統(tǒng)公共事件與自定義公共事件不同之處在于公共事件的發(fā)布者前者是由系統(tǒng)發(fā)布的,后者則需要開發(fā)者在應用中自行發(fā)布。除此之外,二者是完全相同的。因此,在應用開發(fā)過程中,系統(tǒng)公共事件主要發(fā)揮訂閱、處理和退訂功能,而自定義公共事件則包括發(fā)布、訂閱、處理和退訂。HarmonyOS在公共事件處理上采用的是發(fā)布訂閱者模式,在該模式下訂閱者把自己的訂閱事件信息注冊到服務中心,服務中心負責事件的統(tǒng)一調(diào)度,并根據(jù)訂閱者的注冊信息進行事件分發(fā)調(diào)度,訂閱者獲得訂閱的事件信息后,進而處理公共事件。6.1.2公共事件處理接口5公共事件處理相關的基礎類包括:公共事件數(shù)據(jù)類、公共數(shù)據(jù)發(fā)布信息類、公共事件訂閱信息類、公共事件訂閱者類和公共事件管理類。開發(fā)者只要掌握好這些基礎類,就可以更好地理解使用公共事件。公共事件數(shù)據(jù)類公共事件數(shù)據(jù)類主要用于封裝公共事件的相關信息,用于發(fā)布、分發(fā)和接收數(shù)據(jù)。主要包括intent、code和data三個數(shù)據(jù)。公共數(shù)據(jù)發(fā)布信息類公共事件訂閱信息類公共事件訂閱者類公共事件管理類公共數(shù)據(jù)發(fā)布信息類主要封裝公共事件發(fā)布的相關信息,包括公共事件對訂閱者的權限要求、公共事件是否有序、是否是粘性公共事件等。公共事件訂閱信息類用于封裝公共事件訂閱的相關信息,比如優(yōu)先級、線程模式、事件范圍等。公共事件訂閱者類用于封裝公共事件訂閱者及相關參數(shù)信息。公共事件管理類提供了事件發(fā)布、訂閱、退訂的靜態(tài)方法接口,是應用開發(fā)進行公共事件管理的主要接口類。6.1.3訂閱公共事件6當需要訂閱某個公共事件或獲取某個公共事件傳遞的參數(shù)時,首先需要明確訂閱者,即創(chuàng)建一個訂閱者對象,用于作為訂閱公共事件的載體,然后調(diào)閱公共事件并獲取公共事件傳遞而來的參數(shù)。下面介紹訂閱公共事件的主要步驟:

創(chuàng)建CommonEventSubscriber派生類,在onReceiveEvent()回調(diào)函數(shù)中處理公共事件,示例代碼如下:classMyCommonEventSubscriberextendsCommonEventSubscriber{MyCommonEventSubscriber(CommonEventSubscribeInfoinfo){super(info);}@OverridepublicvoidonReceiveEvent(CommonEventDatacommonEventData){}}6.1.3訂閱公共事件7創(chuàng)建訂閱者信息,構造MyCommonEventSubscriber對象,調(diào)用CommonEventManager.subscribeCommonEvent()接口進行訂閱,示例代碼如下:Stringevent="com.my.test";MatchingSkillsmatchingSkills=newMatchingSkills();matchingSkills.addEvent(event);//自定義事件matchingSkills.addEvent(CommonEventSupport.COMMON_EVENT_SCREEN_ON);//亮屏事件CommonEventSubscribeInfosubscribeInfo=newCommonEventSubscribeInfo(matchingSkills);MyCommonEventSubscribersubscriber=newMyCommonEventSubscriber(subscribeInfo);try{CommonEventManager.subscribeCommonEvent(subscriber);}catch(RemoteExceptione){HiLog.error(LABEL,"ExceptionoccurredduringsubscribeCommonEventinvocation.");} 6.1.3訂閱公共事件8如果訂閱擁有指定權限應用發(fā)布的公共事件,發(fā)布者需要在config.json中申請權限,示例代碼如下:"reqPermissions":[{"name":"ohos.abilitydemo.permission.PROVIDER","reason":"Obtaintherequiredpermission","usedScene":{"ability":["com.hmi.ivi.systemsetting.MainAbility"],"when":"inuse"}}]6.1.3訂閱公共事件9如果訂閱的公共事件是有序的,可以調(diào)用setPriority()指定優(yōu)先級,示例代碼如下:Stringevent="com.my.test";MatchingSkillsmatchingSkills=newMatchingSkills();matchingSkills.addEvent(event);//自定義事件CommonEventSubscribeInfosubscribeInfo=newCommonEventSubscribeInfo(matchingSkills);subscribeInfo.setPriority(100);//設置優(yōu)先級,優(yōu)先級取值范圍[-1000,1000],值默認為0。MyCommonEventSubscribersubscriber=newMyCommonEventSubscriber(subscribeInfo);try{CommonEventManager.subscribeCommonEvent(subscriber);}catch(RemoteExceptione){HiLog.error(LABEL,"ExceptionoccurredduringsubscribeCommonEventinvocation.");}6.1.4發(fā)布公共事件10應用中發(fā)布自定義公共事件可以是無序公共事件、有序公共事件、帶權限公共事件和粘性公共事件,這四種不同的公共事件通過調(diào)用不同的接口來決定信息。發(fā)布無序公共事件:公共事件中有序和無序的概念是相對訂閱者而言的。無序公共事件類似于音樂播放器,所有的訂閱者都可以接收且不分先后順序。下列是發(fā)送無序公共事件的核心代碼:try{Intentintent=newIntent();Operationoperation=newIntent.OperationBuilder().withAction("moneventdemo.Unordered").build();intent.setOperation(operation);eventData=newCommonEventData(intent);CommonEventManager.publishCommonEvent(eventData);HiL(LABEL,"發(fā)布無序的公共事件成功!");}catch(RemoteExceptione){HiL(LABEL,"發(fā)布失敗!");}6.1.4發(fā)布公共事件11發(fā)布有序公共事件:發(fā)布有序公共事件需要構造CommonEventPublishlnfo對象,并通過setOrdered(true)方法指定公共事件屬性為有序公共事件,然后進行發(fā)布。核心代碼如下:CommonEventPublishInfopublishInfo=newCommonEventPublishInfo();//設置屬性為有序公共事件publishInfo.setOrdered(true);try{CommonEventManager.publishCommonEvent(eventData,publishInfo);HiL(LABEL,"發(fā)布有序的公共事件成功!");}catch(RemoteExceptione){6.1.4發(fā)布公共事件12發(fā)布帶權限公共事件:帶權限公共事件為事件賦予了一定的訪問權限,且只有申請對應權限的訂閱者才能接收到事件,帶權限公共事件為公共事件的應用提供了一定的安全機制。發(fā)布帶權限公共事件同樣是通過設置CommonEventPublishInfo對象實現(xiàn)的,帶權限公共事件和有序公共事件類似,設置帶權限公共事件的核心代碼如下://設置權限publishInfo.setSubscriberPermissions(permissions);try{CommonEventManager.publishCommonEvent(eventData,publishInfo);HiL(LABEL,"發(fā)布帶權限的公共事件成功!");}catch(RemoteExceptione){HiL(LABEL,"發(fā)布失敗!");}6.1.4發(fā)布公共事件13黏性公共事件:粘性公共事件指公共事件的訂閱動作是在公共事件發(fā)布之后進行,訂閱者也能收到的公共事件類型。從粘性公共事件的特性可以看出相較于一般的公共事件需要訂閱者在公共事件發(fā)布之前完成訂閱,黏性公共事件為在事件發(fā)布之后訂閱者也能接收到事件提供了保障。發(fā)布黏性公共事件只需對構造的CommonEventPublishInfo對象調(diào)用setSticky(true)方法進行設置即可,發(fā)布粘性公共事件核心參考代碼如下:CommonEventPublishInfopublishInfo=newCommonEventPublishInfo();//設置屬性為粘性公共事件publishInfo.setSticky(true);try{CommonEventManager.publishCommonEvent(eventData,publishInfo);HiL(LABEL,"發(fā)布粘性的公共事件成功!");}catch(RemoteExceptione){HiL(LABEL,"發(fā)布失敗!");}6.1.5退訂公共事件14在Ability的onStop()中調(diào)用CommonEventManager.unsubscribeCommonEvent()方法來退訂公共事件。調(diào)用后,之前訂閱的所有公共事件均被退訂。退訂公共事件核心參考代碼如下:try{CommonEventManager.unsubscribeCommonEvent(subscriber);HiL(LABEL,"退訂自定義公共事件成功!");}catch(RemoteExceptione){HiL(LABEL,"退訂失敗!");}6.1.6案例:公共事件的訂閱與發(fā)布15創(chuàng)建一個名為CommonEventDemo的應用來演示,應用初始頁面如圖所示。(詳細代碼請參考6.1.6節(jié))6.1.6案例:公共事件的訂閱與發(fā)布16打開遠程模擬器,運行程序,單擊訂閱系統(tǒng)公共事件按鈕,并打開手機飛行模式,結果如圖所示6.1.6案例:公共事件的訂閱與發(fā)布17單擊訂閱自定義的公共事件按鈕,再單擊發(fā)布無序的公共事件按鈕,結果如圖所示,成功訂閱了無序公共事件。6.2通知6.2.1通知介紹19通知(Notification)是應用顯示信息提示的一種工具。HarmonyOS通過ANS(AdvancedNotificationService,即通知增強服務)服務為用戶提供通知功能,提醒用戶有來自該應用中的信息。當應用向系統(tǒng)發(fā)出通知時,它先以圖標的形式顯示在通知欄中,用戶可以下拉通知欄查看通知的詳細信息。有以下常見的使用場景:顯示當前正在進行的事件,如播放音樂、下載等通知使用場景顯示接收到短消息、即時消息等顯示應用的推送消息,如廣告、版本更新等顯示當前正在進行的事件,如播放音樂、下載等6.2.2通知流程20通知業(yè)務流程由ANS通知子系統(tǒng)、通知發(fā)送端、通知訂閱端組成。一條通知從通知發(fā)送端產(chǎn)生,通過IPC通信發(fā)送到ANS,ANS再分發(fā)給通知訂閱端。系統(tǒng)應用還支持通知相關配置,如使能開關、配置參數(shù)由系統(tǒng)配置發(fā)起請求,發(fā)送到ANS存儲到內(nèi)存和數(shù)據(jù)庫。6.2.3接口說明21通知相關基礎類包含NotificationSlot、NotificationRequest和NotificationHelper。這三個基礎類之間的關系如下圖所示。6.2.3接口說明22NotificationSlotNotificationSlot可以對提示音、振動、鎖屏顯示和重要級別等進行設置。一個應用可以創(chuàng)建一個或多個NotificationSlot,在發(fā)送通知時,通過綁定不同的NotificationSlot,實現(xiàn)不同用途。注意:NotificationSlot需要先通過NotificationHelper的addNotificationSlot(NotificationSlot)方法發(fā)布后,通知才能綁定使用;所有綁定該NotificationSlot的通知在發(fā)布后都具備相應的特性,對象在創(chuàng)建后,將無法更改這些設置,對于是否啟動相應設置,用戶有最終控制權。接口名描述NotificationSlot(Stringid,Stringname,intlevel)構造NotificationSlotsetLevel(intlevel)設置NotificationSlot的級別setName(Stringname)設置NotificationSlot的命名setDescription(Stringdescription)設置NotificationSlot的描述信息enableBypassDnd(booleanbypassDnd)設置是否繞過系統(tǒng)的免打擾模式setEnableVibration(booleanvibration)設置收到通知時是否使能振動setLedLightColor(intcolor)設置收到通知時的呼吸燈顏色setSlotGroup(StringgroupId)綁定當前NotificationSlot到另一個NotificationSlot6.2.3接口說明23NotificationRequestNotificationRequest用于設置具體的通知對象,包括設置通知的屬性,如:通知的分發(fā)時間、小圖標、大圖標、自動刪除等參數(shù),以及設置具體的通知類型,如普通文本、長文本等。下圖所示NotificationRequest類接口說明。說明:NotificationRequest目前只支持普通文本、長文本、圖片、多行、社交、媒體六種通知類型。接口名描述NotificationRequest()構建一個通知NotificationRequest(intnotificationId)構建一個通知,指定通知的idsetNotificationId(intnotificationId)設置通知自動取消的時間setAutoDeletedTime(longtime)設置通知分發(fā)的時間setDeliveryTime(longdeliveryTime)設置通知的創(chuàng)建的時間setSlotId(StringslotId)設置通知的NotificationSlotidsetContent(NotificationRequest.NotificationContentcontent)設置通知的具體類型setTapDismissed(booleantapDismissed)設置通知在用戶點擊后是否自動取消setLittleIcon(PixelMapsmallIcon)設置通知的小圖標,在通知左上角顯示setGroupValue(StringgroupValue)設置分組通知,相同分組的通知在通知欄顯示時,將會折疊在一組應用中顯示。setIntentAgent(IntentAgentagent)設置通知承載指定的IntentAgent,在通知中實現(xiàn)即將觸發(fā)的事件6.2.3接口說明24

NotificationHelperNotificationHelper封裝了發(fā)布、更新、訂閱、刪除通知等靜態(tài)方法。訂閱通知、退訂通知和查詢系統(tǒng)中所有處于活躍狀態(tài)的通知。表所示NotificationHelper類接口說明。接口名描述publishNotification(NotificationRequestrequest)發(fā)布一條通知publishNotification(Stringtag,NotificationRequest)發(fā)布一條帶TAG的通知cancelNotification(intnotificationId)取消指定的通知cancelAllNotifications()取消之前發(fā)布的所有通知addNotificationSlot(NotificationSlotslot)創(chuàng)建一個NotificationSlotgetNotificationSlot(StringslotId)獲取NotificationSlotgetActiveNotifications()獲取當前應用的活躍通知removeNotificationSlot(StringslotId)刪除一個NotificationSlotgetActiveNotifications()獲取當前應用的活躍通知getActiveNotificationNums()獲取系統(tǒng)中當前應用的活躍通知的數(shù)量setNotificationBadgeNum(intnum)設置通知的角標setNotificationBadgeNum()設置當前應用中活躍狀態(tài)通知的數(shù)量在角標顯示6.2.3接口說明25通知的開發(fā)指導分為創(chuàng)建NotificationSlot、發(fā)布通知和取消通知等開發(fā)場景。010203通知開發(fā)步驟創(chuàng)建NotificationSlot:NotificationSlot可以設置公共通知的震動,重要級別等,并通過調(diào)用NotificationHelper.addNotificationSlot()發(fā)布NotificationSlot對象發(fā)布通知:構建NotificationRequest對象,應用發(fā)布通知前,通過NotificationRequest的setSlotId()方法與NotificationSlot綁定,使該通知在發(fā)布后都具備該對象的特征取消通知:取消通知分為取消指定單條通知和取消所有通知,應用只能取消自己發(fā)布的通知。6.2.4通知開發(fā)步驟26通知的開發(fā)指導分為創(chuàng)建NotificationSlot、發(fā)布通知和取消通知等開發(fā)場景。創(chuàng)建NotificationSlot,NotificationSlot可以設置公共通知的震動,重要級別等,并通過調(diào)用NotificationHelper.addNotificationSlot()發(fā)布NotificationSlot對象,示例代碼如下:NotificationSlotslot=newNotificationSlot("slot_001","slot_default", NotificationSlot.LEVEL_MIN);//創(chuàng)建notificationSlot對象slot.setDescription("NotificationSlotDescription");slot.setEnableVibration(true);//設置振動提醒slot.setEnableLight(true);//設置開啟呼吸燈提醒slot.setLedLightColor(Color.RED.getValue());//設置呼吸燈的提醒顏色try{ NotificationHelper.addNotificationSlot(slot);}catch(RemoteExceptionex){ HiLog.error(LABEL,"ExceptionoccurredduringaddNotificationSlotinvocation.");}6.2.4通知開發(fā)步驟27發(fā)布通知,構建NotificationRequest對象,應用發(fā)布通知前,通過NotificationRequest的setSlotId()方法與NotificationSlot綁定,使該通知在發(fā)布后都具備該對象的特征,示例代碼如下:intnotificationId=1;NotificationRequestrequest=newNotificationRequest(notificationId);request.setSlotId(slot.getId());調(diào)用setContent()設置通知的內(nèi)容,示例代碼如下:Stringtitle="title";Stringtext="Thereisanormalnotificationcontent.";NotificationNormalContentcontent=newNotificationNormalContent();content.setTitle(title).setText(text);NotificationRequest.NotificationContentnotificationContent=newNotificationRequest.NotificationContent(content);request.setContent(notificationContent);//設置通知的內(nèi)容調(diào)用publishNotification()發(fā)布通知,示例代碼如下:6.2.4通知開發(fā)步驟28調(diào)用publishNotification()發(fā)布通知,示例代碼如下:try{ NotificationHelper.publishNotification(request);}catch(RemoteExceptionex){ HiLog.error(LABEL,"ExceptionoccurredduringpublishNotificationinvocation.");}取消通知,取消通知分為取消指定單條通知和取消所有通知,應用只能取消自己發(fā)布的通知。調(diào)用cancelNotification()取消指定的單條通知,示例代碼如下:intnotificationId=1;try{ NotificationHelper.cancelNotification(notificationId);}catch(RemoteExceptionex){ HiLog.error(LABEL,"ExceptionoccurredduringcancelNotificationinvocation.");}6.2.5普通文本通知29在眾多通知類型中,普通文本通知是最常用的。發(fā)布一個通知通常需要以下幾個步驟://普通文本NotificationRequest.NotificationNormalContentcontent=newNotificationRequest.NotificationNormalContent();content.setTitle(title).setText(countent);NotificationRequest.NotificationContentnotificationContent=newNotificationRequest.NotificationContent(content);

//設置通知的內(nèi)容request.setContent(notificationContent);request.setIntentAgent(intentAgent);try{NotificationHelper.publishNotification(request);}catch(RemoteExceptione){e.printStackTrace();}創(chuàng)建通知內(nèi)容NotificationContent對象,并設計顯示的通知內(nèi)容。需要將通知配置類傳入NotificationContent對象用于設計通知內(nèi)容。創(chuàng)建通知請求NotiticationRequest對象,傳入NotificationContent對象,并定義通知的參數(shù)(渠道、按鈕、進度、單擊方法等)。通過NotificationHelper的publishNotification方法發(fā)布通知。

發(fā)布普通文本通知核心代碼如下:6.2.6其他通知類型30除了上文介紹的普通文本通知外,還包括長文本通知、多行通知、圖片通知、社交通知、媒體通知等類型。用戶可以根據(jù)實際需要自定義各種通知的類型與用法。各種通知類型的內(nèi)容配置和相關說明如表所示。通知開發(fā)步驟通知類型內(nèi)容配置類描述普通文本通知NotificationNormalContent顯示普通文本內(nèi)容長文本通知NotificationLongTextContent顯示長文本內(nèi)容多行通知NotificationMultiLineContent顯示多行文本內(nèi)容圖片通知NotificationPictureContent顯示圖片及簡短的描述社交通知NotificationConversationalContent顯示即時通信軟件的消息媒體通知NotificationMediaContent顯示信息和相關的按鈕6.2.6其他通知類型31用戶可以根據(jù)實際需要自定義各種通知的類型與用法。各種通知類型的內(nèi)容配置和相關說明如圖所示。通知開發(fā)步驟其他通知類型長文本通知多行文本通知圖片通知社交通知媒體通知長文本通知內(nèi)容通過NotificationLongTextContent對象定義。除了與普通文本通知相同的setTitle方法和setAdditionalText以外,還可以通過serExpandedTitle方法設置。多行文本通知通過NotificationMultiLineContent對象定義,可分別通過setTitle、setTest和setExpandedTitle設置標題和內(nèi)容,在展開時還可以通過addSingleLine()方法設置多行文本內(nèi)容。首先需要獲取圖片資源因為setBigPicture()方法所需的參數(shù)為pixelMap對象,所以創(chuàng)建getPixelMap()方法,作用是將圖片資源轉(zhuǎn)換為pixelMap對象。社交通知先創(chuàng)建用戶信息,再通過NotificationRequest.Notification對象定義,最后發(fā)布社交通知信息。首先準備媒體按鈕資源,將媒體信息放入指定文件夾下再設置標題與內(nèi)容,

再通過NotificationRequest.Notification定義對象,最后指定方式發(fā)布通知。6.2.6其他通知類型32各種通知類型效果展示通知開發(fā)步驟6.2.6其他通知類型33發(fā)布長文本通知代碼示例如下://通知標題Stringtitle="來自NotificationDemo的通知";//通知內(nèi)容Stringtext="通知內(nèi)容:這是一個測試的長文本通知內(nèi)容"+",這是一個測試的長文本通知內(nèi)容"+",這是一個測試的長文本通知內(nèi)容。";NotificationRequest.NotificationLongTextContentcontent=new NotificationRequest.NotificationLongTextContent();content.setTitle(title);

//設置長文本內(nèi)容content.setLongText(text);6.2.6其他通知類型34多行文本通知示例代碼//通知標題Stringtitle="來自NotificationDemo的通知";//通知內(nèi)容Stringtext="通知內(nèi)容:這是一個測試的多行文本通知內(nèi)容";//設置通知類型為圖片NotificationRequest.NotificationMultiLineContentcontent=new NotificationRequest.NotificationMultiLineContent();content.setTitle(title);//設置多行文本內(nèi)容content.addSingleLine(text);content.addSingleLine(text);content.addSingleLine(text);6.2.6其他通知類型35圖片通知內(nèi)容核心代碼如下//通知標題Stringtitle="來自NotificationDemo的通知";//通知內(nèi)容Stringtext="通知內(nèi)容:這是一個測試的圖片通知內(nèi)容";//設置通知類型為圖片NotificationRequest.NotificationPictureContentcontent=newNotificationRequest.NotificationPictureContent();content.setTitle(title);content.setText(text);//設置包含在通知中的圖片content.setBigPicture(getPixelMap(ResourceTable.Media_icon));6.2.6其他通知類型36社交通知核心代碼如下://消息用戶MessageUserUser=newMessageUser();User.setName("張三");//社交通知內(nèi)容NotificationRequest.NotificationConversationalContentcontent=newNotificationRequest.NotificationConversationalContent(User) .addConversationalMessage(newNotificationRequest .NotificationConversationalContent .ConversationalMessage("你好!",Time.getCurrentTime(),User));6.2.6其他通知類型37媒體通知核心代碼如下://通知標題Stringtitle="來自NotificationDemo的通知";//通知內(nèi)容Stringtext="通知內(nèi)容:這是一個測試的媒體通知內(nèi)容";//媒體通知NotificationRequest.NotificationMediaContentcontent=new NotificationRequest.NotificationMediaContent();//設置通知標題content.setTitle(title);//設置通知標題content.setText(text);//設置媒體通知待展示的按鈕content.setShownActions(newint[]{0});//定義開始按鈕NotificationActionButtonButton=newNotificationActionButton .Builder(getPixelMap(ResourceTable.Media_Play),"開始",null).build();//放置開始操作按鈕request.addActionButton(Button);6.2.6其他通知類型38媒體通知核心代碼如下://通知標題Stringtitle="來自NotificationDemo的通知";//通知內(nèi)容Stringtext="通知內(nèi)容:這是一個測試的媒體通知內(nèi)容";//媒體通知NotificationRequest.NotificationMediaContentcontent=new NotificationRequest.NotificationMediaContent();//設置通知標題content.setTitle(title);//設置通知標題content.setText(text);//設置媒體通知待展示的按鈕content.setShownActions(newint[]{0});//定義開始按鈕NotificationActionButtonButton=newNotificationActionButton .Builder(getPixelMap(ResourceTable.Media_Play),"開始",null).build();//放置開始操作按鈕request.addActionButton(Button);6.2.7案例:通知的發(fā)布和取消39創(chuàng)建一個名為NotificationDemo的應用來作為演示。頁面需要發(fā)布一個通知按鈕組件和取消通知按鈕組件,XML文件中的內(nèi)容這里不再贅述。修改MainAbilitySice,其內(nèi)容如下:publicclassMainAbilitySliceextendsAbilitySlice{//定義日志標簽

privatestaticfinalHiLogLabelLABEL_LOG=newHiLogLabel(HiLog.LOG_APP,0X00001,"MainAbilitySlice");//遞增的序列

privateintnotificationId=0;@OverridepublicvoidonStart(Intentintent){super.onStart(intent);super.setUIContent(ResourceTable.Layout_ability_main);//找到組件

ButtonButton_Publish=findComponentById(ResourceTable.Id_Button_Publish);ButtonButton_Cancel=findComponentById(ResourceTable.Id_Button_Cancel);//給Button_Publish添加單擊事件

Button_Publish.setClickedListener(component->{6.2.7案例:通知的發(fā)布和取消40 //獲取NotificationSlot對象

NotificationSlotslot=newNotificationSlot("slot_001","slot_default",NotificationSlot.LEVEL_HIGH);//設置提示內(nèi)容

slot.setDescription("FromNotificationDemo");//設置振動提醒

slot.setEnableVibration(true);//設置在鎖屏時屏幕上顯示通知,顯示模式為將通知的內(nèi)容顯示在鎖定屏幕上slot.setLockscreenVisibleness(NotificationRequest.VISIBLENESS_TYPE_PUBLIC);//設置開啟呼吸燈提醒

slot.setEnableLight(true);//設置呼吸燈的提醒顏色為紅色

slot.setLedLightColor(Color.RED.getValue());try{ //綁定設置好的slotNotificationHelper.addNotificationSlot(slot);//通知標題

Stringtitle="來自NotificationDemo的通知";6.2.7案例:通知的發(fā)布和取消41 //通知內(nèi)容

Stringtext="通知內(nèi)容:這是一個測試的通知內(nèi)容";//設置通知類型為普通文本

NotificationRequest.NotificationNormalContentcontent=newNotificationRequest.NotificationNormalContent();//設置通知標題

content.setTitle(title)//設置通知標題

.setText(text); //通知Id自增

notificationId++;//構建一個通知,指定通知的idNotificationRequestrequest=newNotificationRequest(notificationId);//設置通知的具體內(nèi)容

NotificationRequest.NotificationContentnotificationContent=newNotificationRequest.NotificationContent(content);//設置通知的內(nèi)容

request.setContent(notificationContent);//設置通知的NotificationSlotidrequest.setSlotId(slot.getId());

6.2.7案例:通知的發(fā)布和取消42//發(fā)布一條通知

NotificationHelper.publishNotification(request);}catch(RemoteExceptionex){HiLog.warn(LABEL_LOG,"發(fā)布失敗!");}});//給Button_Cancel添加單擊事件

Button_Cancel.setClickedListener(component->{try{//取消指定的通知

NotificationHelper.cancelNotification(notificationId);}catch(RemoteExceptionex){HiLog.warn(LABEL_LOG,"取消通知失敗!");}});}@OverridepublicvoidonActive(){super.onActive();}@OverridepublicvoidonForeground(Intentintent){super.onForeground(intent);}}6.2.7案例:通知的發(fā)布和取消43打開遠程模擬器,運行程序,單擊“發(fā)送通知”按鈕,運行結果如下圖所示。Thankyou

forwatching!第7章線程管理與線程通信45引言本章學習目標理解HarmonyOS線程與任務分發(fā)器的概念熟練使用全局并發(fā)任務分發(fā)器異步分發(fā)了解HarmonyOS線程通信概念及其運作機制46第7章線程管理與線程通信7.1線程概念7.2任務分發(fā)器TaskDispatcher7.3線程通信477.1線程概念48不同應用在各自獨立的進程中運行,每個應用都對應一個屬于自己的進程,在該進程中又默認創(chuàng)建一個主線程。該線程隨著應用創(chuàng)建或消失,是應用的核心線程。UI界面的顯示和更新等操作,都是在主線程中進行。故主線程又稱UI線程,在默認情況下,所有的操作都是在主線程上執(zhí)行。如果需要執(zhí)行比較耗時的任務(如下載文件、查詢數(shù)據(jù)庫等),可創(chuàng)建其他線程來處理。當應用以任何形式啟動時,系統(tǒng)會為其創(chuàng)建進程,該進程將持續(xù)運行。當進程完成當前任務處于等待狀態(tài),且系統(tǒng)資源不足時,系統(tǒng)會自動回收該進程。這里要區(qū)分線程與進程,在開發(fā)應用時,我們不能控制進程的調(diào)度,但我們可以調(diào)度控制線程。線程是進程內(nèi)部的概念,一個進程可以包含多個線程,開發(fā)一個應用需要對線程進行有效且合理的調(diào)度控制。第7章線程管理與線程通信7.3線程通信497.2任務分發(fā)器TaskDispatcher7.1線程概念7.2.1任務分發(fā)器類型50TaskDispatcher具有多種實現(xiàn),每種實現(xiàn)對應不同的任務分發(fā)器。在分發(fā)任務時可以指定任務的優(yōu)先級,由同一個任務分發(fā)器分發(fā)出的任務具有相同的優(yōu)先級。系統(tǒng)提供的任務分發(fā)器有GlobalTaskDispatcher、ParallelTaskDispatcher、SerialTaskDispatcher、SpecTaskDispatcher。全局并發(fā)任務分發(fā)器GlobalTaskDispatcher由getGlobalTaskDispatcher(TaskPrioritypriority)方法獲取,該方法只需要一個參數(shù)priority,即線程優(yōu)先級。適用于分發(fā)并行任務,且任務之間沒有聯(lián)系的情況。一個應用只有一個GlobalTaskDispatcher,它在程序結束時才被銷毀。創(chuàng)建全局并發(fā)任務分發(fā)器的示例代碼如下:TaskDispatcherglobalTaskDispatcher=getGlobalTaskDispatcher(TaskPriority.DEFAULT);7.2.1任務分發(fā)器類型51并發(fā)任務分發(fā)器ParallelTaskDispatcher由createParallelTaskDispatcher(Stringname,TaskPrioritypriority)方法創(chuàng)建并返回。與GlobalTaskDispatcher不同的是,ParallelTaskDispatcher不具有全局唯一性,可以創(chuàng)建多個。該方法中的name參數(shù)對應分發(fā)器名稱,priority參數(shù)為線程優(yōu)先級。開發(fā)者在創(chuàng)建或銷毀分發(fā)器時,需要持有對應的對象引用。創(chuàng)建并發(fā)任務分發(fā)器的示例代碼如下:StringdispatcherName="parallelTaskDispatcher";TaskDispatcherparallelTaskDispatcher=createParallelTaskDispatcher( dispatcherName, TaskPriority.DEFAULT);7.2.1任務分發(fā)器類型52串行任務分發(fā)器SerialTaskDispatcher由createSerialTaskDispatcher(Stringname,TaskPrioritypriority)創(chuàng)建并返回。由該分發(fā)器分發(fā)的所有的任務都是按順序執(zhí)行,但是執(zhí)行這些任務的線程并不是固定的。如果要執(zhí)行并行任務,應使用ParallelTaskDispatcher或者GlobalTaskDispatcher,而不是創(chuàng)建多個SerialTaskDispatcher。如果任務之間沒有依賴,應使用GlobalTaskDispatcher來實現(xiàn)。它的創(chuàng)建和銷毀由開發(fā)者自己管理,開發(fā)者在使用期間需要持有該對象引用。創(chuàng)建串行任務分發(fā)器的示例代碼如下:StringdispatcherName="serialTaskDispatcher";TaskDispatcherserialTaskDispatcher=createSerialTaskDispatcher( dispatcherName, TaskPriority.DEFAULT);7.2.1任務分發(fā)器類型53專有任務分發(fā)器SpecTaskDispatcher綁定到專有線程上的任務分發(fā)器。目前已有的專有線程為UI線程,通過UITaskDispatcher進行任務分發(fā)。UITaskDispatcher:綁定到應用主線程的專有任務分發(fā)器,由Ability執(zhí)行getUITaskDispatcher()創(chuàng)建并返回。由該分發(fā)器分發(fā)的所有的任務都是在主線程上按順序執(zhí)行,它在應用程序結束時被銷毀。創(chuàng)建專有任務分發(fā)器的示例代碼如下:TaskDispatcheruiTaskDispatcher=getUITaskDispatcher();在上述四個分發(fā)器中,并行是指多個任務同時進行處理,通常少量且任務類型不同的情況下使用并行分發(fā)。串行是指一個任務執(zhí)行結束后再執(zhí)行下一個任務,通常大量且相關性較強的情況下使用串行分發(fā)。7.2.2任務分發(fā)方式54常見任務分發(fā)方式主要有同步分發(fā)任務和異步分發(fā)任務兩種。采用同步分發(fā)任務的方式,在執(zhí)行任務過程中會阻塞當前線程,直到分發(fā)的任務執(zhí)行完畢,才會繼續(xù)執(zhí)行當前線程。而異步分發(fā)任務的方式不會阻塞當前線程。其他高級分發(fā)方式如:異步延遲任務分發(fā)、分組任務分發(fā)、多次任務分發(fā)等。同步分發(fā)

同步分發(fā)的方式分發(fā)任務會阻塞當前線程,它的執(zhí)行流程如圖所示。異步分發(fā)

異步分發(fā)的方式如圖所示。7.2.3案例:多種任務分發(fā)方式55下面將在應用中介紹如何同步、異步、異步延遲、分組分發(fā)任務。創(chuàng)建一個名為TaskDispatcherDemo的應用來演示,頁面需要四個Button組件和一個圓形進度條組件。(詳細代碼請參考7.2.3節(jié))打開遠程模擬器,運行程序,應用初始頁面如下圖所示:7.2.3案例:多種任務分發(fā)方式56點擊同步分發(fā)按鈕,持續(xù)點擊下方進度條,會發(fā)現(xiàn)在2s內(nèi),進度條的值不會增長。2s后線程內(nèi)任務執(zhí)行完畢,繼續(xù)點擊進度條,進度條的值會增長。日志內(nèi)容如下: 05-1716:17:49.41813720-13720/com.example.taskdispatcherdemoI00922/MainAbilitySlice:主線程:main. 05-1716:17:49.42013720-19002/com.example.taskdispatcherdemoI00922/MainAbilitySlice:同步分發(fā)任務線程:PoolThread-1. 05-1716:17:49.42013720-19002/com.example.taskdispatcherdemoI00922/MainAbilitySlice:開始執(zhí)行同步分發(fā)任務! 05-1716:17:51.42013720-19002/com.example.taskdispatcherdemoI00922/MainAbilitySlice:同步分發(fā)任務執(zhí)行完成!7.2.3案例:多種任務分發(fā)方式57點擊異步分發(fā)按鈕,點擊下方進度條,進度條的值會增長。日志內(nèi)容如下: 05-1716:18:21.53913720-22155/com.example.taskdispatcherdemoI00922/MainAbilitySlice:異步分發(fā)任務線程:PoolThread-2.05-1716:18:21.53913720-22155/com.example.taskdispatcherdemoI00922/MainAbilitySlice:開始執(zhí)行異步分發(fā)任務!05-1716:18:23.53913720-22155/com.example.taskdispatcherdemoI00922/MainAbilitySlice:異步分發(fā)任務執(zhí)行完成!點擊異步延遲分發(fā)按鈕,2s后新創(chuàng)建的線程才會開始執(zhí)行任務。日志內(nèi)容如下:05-1716:18:52.44913720-13720/com.example.taskdispatcherdemoI00922/MainAbilitySlice:異步延遲分發(fā)按鈕被點擊.05-1716:18:54.45213720-25248/com.example.taskdispatcherdemoI00922/MainAbilitySlice:異步延遲分發(fā)任務線程:PoolThread-3.05-1716:18:54.45213720-25248/com.example.taskdispatcherdemoI00922/MainAbilitySlice:開始執(zhí)行異延遲步分發(fā)任務!05-1716:18:56.45213720-25248/com.example.taskdispatcherdemoI00922/MainAbilitySlice:異步延遲分發(fā)任務執(zhí)行完成!7.2.3案例:多種任務分發(fā)方式58點擊分組任務分發(fā)按鈕。日志內(nèi)容如下: 05-1716:21:49.29113720-12060/com.example.taskdispatcherdemoI00922/MainAbilitySlice:任務一線程:PoolThread-4.05-1716:21:49.29113720-12060/com.example.taskdispatcherdemoI00922/MainAbilitySlice:任務一執(zhí)行完畢!05-1716:21:49.29513720-12061/com.example.taskdispatcherdemoI00922/MainAbilitySlice:任務二線程:PoolThread-5.05-1716:21:49.29513720-12061/com.example.taskdispatcherdemoI00922/MainAbilitySlice:任務二執(zhí)行完畢!第7章線程管理與線程通信597.1線程概念7.3線程通信7.2任務分發(fā)器TaskDispatcher7.3.1基本概念60EventRunner是一種事件循環(huán)器,循環(huán)處理從該EventRunner創(chuàng)建的新線程的事件隊列中獲取InnerEvent事件或者Runnable任務。InnerEvent是EventHandler投遞的事件。EventHandler是一種用戶在當前線程上投遞InnerEvent事件或者Runnable任務到異步線程上處理的機制。每一個EventHandler和指定的EventRunner所創(chuàng)建的新線程綁定,并且該新線程內(nèi)部有一個事件隊列。EventHandler可以投遞指定的InnerEvent事件或Runnable任務到這個事件隊列。EventRunner從事件隊列里循環(huán)地取出事件,如果取出的事件是InnerEvent事件,將在EventRunner所在線程執(zhí)行processEvent回調(diào);如果取出的事件是Runnable任務,將在EventRunner所在線程執(zhí)行Runnable的run回調(diào)。一般,EventHandler有兩個主要作用:在不同線程間分發(fā)和處理InnerEvent事件或Runnable任務。延遲處理InnerEvent事件或Runnable任務。7.3.2運作機制61EventHandler的運作機制如圖所示。使用EventHandler實現(xiàn)線程間通信的主要流程:EventHandler投遞具體的InnerEvent事件或者Runnable任務到EventRunner所創(chuàng)建的線程的事件隊列。EventRunner循環(huán)從事件隊列中獲取InnerEvent事件或者Runnable任務。處理事件或任務:如果EventRunner取出的事件為InnerEvent事件,則觸發(fā)EventHandler的回調(diào)方法并觸發(fā)EventHandler的處理方法,在新線程上處理該事件。如果EventRunner取出的事件為Runnable任務,則EventRunner直接在新線程上處理Runnable任務。7.3.2運作機制62運作機制010203運作機制約束限制:在進行線程間通信的時候,EventHandler只能和EventRunner所創(chuàng)建的線程進行綁定,EventRunner創(chuàng)建時需要判斷是否創(chuàng)建成功,只有確保獲取的EventRunner實例非空時,才可以使用EventHandler綁定EventRunner。EventHandler適用場景:EventHandler的主要功能是將InnerEvent事件或者Runnable任務投遞到其他的線程進行處理,其使用的場景包括:InnerEvent事件和Runnable任務。EventRunner工作模式:EventRunner的工作模式可以分為托管模式和手動模式。兩種模式是在調(diào)用EventRunner的create()方法時,通過選擇不同的參數(shù)來實現(xiàn)的,詳見API參考。默認為托管模式。7.3.3案例:線程通信63創(chuàng)建一個名為ThreadCommunicationDemo的應用來介紹使用EventHandler投遞InnerEvent事件或Runnable任務到其他線程進行處理。其內(nèi)容如下:運作機制<?xmlversion="1.0"encoding="utf-8"?><DirectionalLayoutxmlns:ohos="/res/ohos"ohos:height="match_parent"ohos:width="match_parent"ohos:alignment="top"ohos:orientation="vertical"><Textohos:height="match_content"ohos:width="match_content"ohos:background_element="$graphic:background_ability_main"ohos:layout_alignment="horizontal_center"ohos:text="線程通信案例"ohos:text_size="28fp"/>7.3.3案例:線程通信64運作機制<Buttonohos:id="$+id:Button_sendEvent"ohos:height="match_content"ohos:width="match_parent" ohos:background_element="$graphic:background_ability_main_button"ohos:layout_alignment="horizontal_center"ohos:margin="15vp"ohos:padding="5vp"ohos:text="投遞InnerEvent事件"ohos:text_size="28fp"/><Buttonohos:id="$+id:Button_sendTask"ohos:height="match_content"ohos:width="match_parent"

7.3.3案例:線程通信65運作機制 ohos:background_element="$graphic:background_ability_main_button"ohos:layout_alignment="horizontal_center"ohos:margin="15vp"ohos:padding="5vp"ohos:text="投遞Runnable任務"ohos:text_size="28fp"/></DirectionalLayout>

首先介紹使用EventHandler投遞InnerEvent事件,并按照優(yōu)先級和延時進行處理創(chuàng)建類MyEventHandler并使其繼承EventHandler類,在MyEventHandler類中重寫實現(xiàn)方法processEvent()來處理事件。MyEventHandler類內(nèi)容如下:publicclassMyEventHandlerextendsEventHandler{privatestaticfinalintTask1=0;privatestaticfinalintTask2=1;privatestaticfinalintTask3=2;7.3.3案例:線程通信66運作機制//定義日志標簽

privatestaticfinalHiLogLabelLABEL_LOG=newHiLogLabel(HiLog.LOG_APP,0x00922,"MyEventHandler");publicMyEventHandler(EventRunnerrunner)throwsIllegalArgumentException{super(runner);}@OverridepublicvoidprocessEvent(InnerEventevent){cessEvent(event);if(event==null){HiL(LABEL_LOG,"processEvent事件為空!");return;}7.3.3案例:線程通信67運作機制 inteventId=event.eventId;switch(eventId){

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論