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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

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

創(chuàng)建CommonEventSubscriber派生類,在onReceiveEvent()回調(diào)函數(shù)中處理公共事件,示例代碼如下:classMyCommonEventSubscriberextendsCommonEventSubscriber{MyCommonEventSubscriber(CommonEventSubscribeInfoinfo){super(info);}@OverridepublicvoidonReceiveEvent(CommonEventDatacommonEventData){}}6.1.3訂閱公共事件7創(chuàng)建訂閱者信息,構(gòu)造MyCommonEventSubscriber對(duì)象,調(diào)用CommonEventManager.subscribeCommonEvent()接口進(jìn)行訂閱,示例代碼如下: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如果訂閱擁有指定權(quán)限應(yīng)用發(fā)布的公共事件,發(fā)布者需要在config.json中申請(qǐng)權(quán)限,示例代碼如下:"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)先級(jí),示例代碼如下:Stringevent="com.my.test";MatchingSkillsmatchingSkills=newMatchingSkills();matchingSkills.addEvent(event);//自定義事件CommonEventSubscribeInfosubscribeInfo=newCommonEventSubscribeInfo(matchingSkills);subscribeInfo.setPriority(100);//設(shè)置優(yōu)先級(jí),優(yōu)先級(jí)取值范圍[-1000,1000],值默認(rèn)為0。MyCommonEventSubscribersubscriber=newMyCommonEventSubscriber(subscribeInfo);try{CommonEventManager.subscribeCommonEvent(subscriber);}catch(RemoteExceptione){HiLog.error(LABEL,"ExceptionoccurredduringsubscribeCommonEventinvocation.");}6.1.4發(fā)布公共事件10應(yīng)用中發(fā)布自定義公共事件可以是無序公共事件、有序公共事件、帶權(quán)限公共事件和粘性公共事件,這四種不同的公共事件通過調(diào)用不同的接口來決定信息。發(fā)布無序公共事件:公共事件中有序和無序的概念是相對(duì)訂閱者而言的。無序公共事件類似于音樂播放器,所有的訂閱者都可以接收且不分先后順序。下列是發(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ā)布有序公共事件需要構(gòu)造CommonEventPublishlnfo對(duì)象,并通過setOrdered(true)方法指定公共事件屬性為有序公共事件,然后進(jìn)行發(fā)布。核心代碼如下:CommonEventPublishInfopublishInfo=newCommonEventPublishInfo();//設(shè)置屬性為有序公共事件publishInfo.setOrdered(true);try{CommonEventManager.publishCommonEvent(eventData,publishInfo);HiL(LABEL,"發(fā)布有序的公共事件成功!");}catch(RemoteExceptione){6.1.4發(fā)布公共事件12發(fā)布帶權(quán)限公共事件:帶權(quán)限公共事件為事件賦予了一定的訪問權(quán)限,且只有申請(qǐng)對(duì)應(yīng)權(quán)限的訂閱者才能接收到事件,帶權(quán)限公共事件為公共事件的應(yīng)用提供了一定的安全機(jī)制。發(fā)布帶權(quán)限公共事件同樣是通過設(shè)置CommonEventPublishInfo對(duì)象實(shí)現(xiàn)的,帶權(quán)限公共事件和有序公共事件類似,設(shè)置帶權(quán)限公共事件的核心代碼如下://設(shè)置權(quán)限publishInfo.setSubscriberPermissions(permissions);try{CommonEventManager.publishCommonEvent(eventData,publishInfo);HiL(LABEL,"發(fā)布帶權(quán)限的公共事件成功!");}catch(RemoteExceptione){HiL(LABEL,"發(fā)布失敗!");}6.1.4發(fā)布公共事件13黏性公共事件:粘性公共事件指公共事件的訂閱動(dòng)作是在公共事件發(fā)布之后進(jìn)行,訂閱者也能收到的公共事件類型。從粘性公共事件的特性可以看出相較于一般的公共事件需要訂閱者在公共事件發(fā)布之前完成訂閱,黏性公共事件為在事件發(fā)布之后訂閱者也能接收到事件提供了保障。發(fā)布黏性公共事件只需對(duì)構(gòu)造的CommonEventPublishInfo對(duì)象調(diào)用setSticky(true)方法進(jìn)行設(shè)置即可,發(fā)布粘性公共事件核心參考代碼如下:CommonEventPublishInfopublishInfo=newCommonEventPublishInfo();//設(shè)置屬性為粘性公共事件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)建一個(gè)名為CommonEventDemo的應(yīng)用來演示,應(yīng)用初始頁面如圖所示。(詳細(xì)代碼請(qǐng)參考6.1.6節(jié))6.1.6案例:公共事件的訂閱與發(fā)布16打開遠(yuǎn)程模擬器,運(yùn)行程序,單擊訂閱系統(tǒng)公共事件按鈕,并打開手機(jī)飛行模式,結(jié)果如圖所示6.1.6案例:公共事件的訂閱與發(fā)布17單擊訂閱自定義的公共事件按鈕,再單擊發(fā)布無序的公共事件按鈕,結(jié)果如圖所示,成功訂閱了無序公共事件。6.2通知6.2.1通知介紹19通知(Notification)是應(yīng)用顯示信息提示的一種工具。HarmonyOS通過ANS(AdvancedNotificationService,即通知增強(qiáng)服務(wù))服務(wù)為用戶提供通知功能,提醒用戶有來自該應(yīng)用中的信息。當(dāng)應(yīng)用向系統(tǒng)發(fā)出通知時(shí),它先以圖標(biāo)的形式顯示在通知欄中,用戶可以下拉通知欄查看通知的詳細(xì)信息。有以下常見的使用場景:顯示當(dāng)前正在進(jìn)行的事件,如播放音樂、下載等通知使用場景顯示接收到短消息、即時(shí)消息等顯示應(yīng)用的推送消息,如廣告、版本更新等顯示當(dāng)前正在進(jìn)行的事件,如播放音樂、下載等6.2.2通知流程20通知業(yè)務(wù)流程由ANS通知子系統(tǒng)、通知發(fā)送端、通知訂閱端組成。一條通知從通知發(fā)送端產(chǎn)生,通過IPC通信發(fā)送到ANS,ANS再分發(fā)給通知訂閱端。系統(tǒng)應(yīng)用還支持通知相關(guān)配置,如使能開關(guān)、配置參數(shù)由系統(tǒng)配置發(fā)起請(qǐng)求,發(fā)送到ANS存儲(chǔ)到內(nèi)存和數(shù)據(jù)庫。6.2.3接口說明21通知相關(guān)基礎(chǔ)類包含NotificationSlot、NotificationRequest和NotificationHelper。這三個(gè)基礎(chǔ)類之間的關(guān)系如下圖所示。6.2.3接口說明22NotificationSlotNotificationSlot可以對(duì)提示音、振動(dòng)、鎖屏顯示和重要級(jí)別等進(jìn)行設(shè)置。一個(gè)應(yīng)用可以創(chuàng)建一個(gè)或多個(gè)NotificationSlot,在發(fā)送通知時(shí),通過綁定不同的NotificationSlot,實(shí)現(xiàn)不同用途。注意:NotificationSlot需要先通過NotificationHelper的addNotificationSlot(NotificationSlot)方法發(fā)布后,通知才能綁定使用;所有綁定該NotificationSlot的通知在發(fā)布后都具備相應(yīng)的特性,對(duì)象在創(chuàng)建后,將無法更改這些設(shè)置,對(duì)于是否啟動(dòng)相應(yīng)設(shè)置,用戶有最終控制權(quán)。接口名描述NotificationSlot(Stringid,Stringname,intlevel)構(gòu)造NotificationSlotsetLevel(intlevel)設(shè)置NotificationSlot的級(jí)別setName(Stringname)設(shè)置NotificationSlot的命名setDescription(Stringdescription)設(shè)置NotificationSlot的描述信息enableBypassDnd(booleanbypassDnd)設(shè)置是否繞過系統(tǒng)的免打擾模式setEnableVibration(booleanvibration)設(shè)置收到通知時(shí)是否使能振動(dòng)setLedLightColor(intcolor)設(shè)置收到通知時(shí)的呼吸燈顏色setSlotGroup(StringgroupId)綁定當(dāng)前NotificationSlot到另一個(gè)NotificationSlot6.2.3接口說明23NotificationRequestNotificationRequest用于設(shè)置具體的通知對(duì)象,包括設(shè)置通知的屬性,如:通知的分發(fā)時(shí)間、小圖標(biāo)、大圖標(biāo)、自動(dòng)刪除等參數(shù),以及設(shè)置具體的通知類型,如普通文本、長文本等。下圖所示NotificationRequest類接口說明。說明:NotificationRequest目前只支持普通文本、長文本、圖片、多行、社交、媒體六種通知類型。接口名描述NotificationRequest()構(gòu)建一個(gè)通知NotificationRequest(intnotificationId)構(gòu)建一個(gè)通知,指定通知的idsetNotificationId(intnotificationId)設(shè)置通知自動(dòng)取消的時(shí)間setAutoDeletedTime(longtime)設(shè)置通知分發(fā)的時(shí)間setDeliveryTime(longdeliveryTime)設(shè)置通知的創(chuàng)建的時(shí)間setSlotId(StringslotId)設(shè)置通知的NotificationSlotidsetContent(NotificationRequest.NotificationContentcontent)設(shè)置通知的具體類型setTapDismissed(booleantapDismissed)設(shè)置通知在用戶點(diǎn)擊后是否自動(dòng)取消setLittleIcon(PixelMapsmallIcon)設(shè)置通知的小圖標(biāo),在通知左上角顯示setGroupValue(StringgroupValue)設(shè)置分組通知,相同分組的通知在通知欄顯示時(shí),將會(huì)折疊在一組應(yīng)用中顯示。setIntentAgent(IntentAgentagent)設(shè)置通知承載指定的IntentAgent,在通知中實(shí)現(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)建一個(gè)NotificationSlotgetNotificationSlot(StringslotId)獲取NotificationSlotgetActiveNotifications()獲取當(dāng)前應(yīng)用的活躍通知removeNotificationSlot(StringslotId)刪除一個(gè)NotificationSlotgetActiveNotifications()獲取當(dāng)前應(yīng)用的活躍通知getActiveNotificationNums()獲取系統(tǒng)中當(dāng)前應(yīng)用的活躍通知的數(shù)量setNotificationBadgeNum(intnum)設(shè)置通知的角標(biāo)setNotificationBadgeNum()設(shè)置當(dāng)前應(yīng)用中活躍狀態(tài)通知的數(shù)量在角標(biāo)顯示6.2.3接口說明25通知的開發(fā)指導(dǎo)分為創(chuàng)建NotificationSlot、發(fā)布通知和取消通知等開發(fā)場景。010203通知開發(fā)步驟創(chuàng)建NotificationSlot:NotificationSlot可以設(shè)置公共通知的震動(dòng),重要級(jí)別等,并通過調(diào)用NotificationHelper.addNotificationSlot()發(fā)布NotificationSlot對(duì)象發(fā)布通知:構(gòu)建NotificationRequest對(duì)象,應(yīng)用發(fā)布通知前,通過NotificationRequest的setSlotId()方法與NotificationSlot綁定,使該通知在發(fā)布后都具備該對(duì)象的特征取消通知:取消通知分為取消指定單條通知和取消所有通知,應(yīng)用只能取消自己發(fā)布的通知。6.2.4通知開發(fā)步驟26通知的開發(fā)指導(dǎo)分為創(chuàng)建NotificationSlot、發(fā)布通知和取消通知等開發(fā)場景。創(chuàng)建NotificationSlot,NotificationSlot可以設(shè)置公共通知的震動(dòng),重要級(jí)別等,并通過調(diào)用NotificationHelper.addNotificationSlot()發(fā)布NotificationSlot對(duì)象,示例代碼如下:NotificationSlotslot=newNotificationSlot("slot_001","slot_default", NotificationSlot.LEVEL_MIN);//創(chuàng)建notificationSlot對(duì)象slot.setDescription("NotificationSlotDescription");slot.setEnableVibration(true);//設(shè)置振動(dòng)提醒slot.setEnableLight(true);//設(shè)置開啟呼吸燈提醒slot.setLedLightColor(Color.RED.getValue());//設(shè)置呼吸燈的提醒顏色try{ NotificationHelper.addNotificationSlot(slot);}catch(RemoteExceptionex){ HiLog.error(LABEL,"ExceptionoccurredduringaddNotificationSlotinvocation.");}6.2.4通知開發(fā)步驟27發(fā)布通知,構(gòu)建NotificationRequest對(duì)象,應(yīng)用發(fā)布通知前,通過NotificationRequest的setSlotId()方法與NotificationSlot綁定,使該通知在發(fā)布后都具備該對(duì)象的特征,示例代碼如下:intnotificationId=1;NotificationRequestrequest=newNotificationRequest(notificationId);request.setSlotId(slot.getId());調(diào)用setContent()設(shè)置通知的內(nèi)容,示例代碼如下:Stringtitle="title";Stringtext="Thereisanormalnotificationcontent.";NotificationNormalContentcontent=newNotificationNormalContent();content.setTitle(title).setText(text);NotificationRequest.NotificationContentnotificationContent=newNotificationRequest.NotificationContent(content);request.setContent(notificationContent);//設(shè)置通知的內(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.");}取消通知,取消通知分為取消指定單條通知和取消所有通知,應(yīng)用只能取消自己發(fā)布的通知。調(diào)用cancelNotification()取消指定的單條通知,示例代碼如下:intnotificationId=1;try{ NotificationHelper.cancelNotification(notificationId);}catch(RemoteExceptionex){ HiLog.error(LABEL,"ExceptionoccurredduringcancelNotificationinvocation.");}6.2.5普通文本通知29在眾多通知類型中,普通文本通知是最常用的。發(fā)布一個(gè)通知通常需要以下幾個(gè)步驟://普通文本NotificationRequest.NotificationNormalContentcontent=newNotificationRequest.NotificationNormalContent();content.setTitle(title).setText(countent);NotificationRequest.NotificationContentnotificationContent=newNotificationRequest.NotificationContent(content);

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

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

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

//設(shè)置長文本內(nèi)容content.setLongText(text);6.2.6其他通知類型34多行文本通知示例代碼//通知標(biāo)題Stringtitle="來自NotificationDemo的通知";//通知內(nèi)容Stringtext="通知內(nèi)容:這是一個(gè)測試的多行文本通知內(nèi)容";//設(shè)置通知類型為圖片NotificationRequest.NotificationMultiLineContentcontent=new NotificationRequest.NotificationMultiLineContent();content.setTitle(title);//設(shè)置多行文本內(nèi)容content.addSingleLine(text);content.addSingleLine(text);content.addSingleLine(text);6.2.6其他通知類型35圖片通知內(nèi)容核心代碼如下//通知標(biāo)題Stringtitle="來自NotificationDemo的通知";//通知內(nèi)容Stringtext="通知內(nèi)容:這是一個(gè)測試的圖片通知內(nèi)容";//設(shè)置通知類型為圖片NotificationRequest.NotificationPictureContentcontent=newNotificationRequest.NotificationPictureContent();content.setTitle(title);content.setText(text);//設(shè)置包含在通知中的圖片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媒體通知核心代碼如下://通知標(biāo)題Stringtitle="來自NotificationDemo的通知";//通知內(nèi)容Stringtext="通知內(nèi)容:這是一個(gè)測試的媒體通知內(nèi)容";//媒體通知NotificationRequest.NotificationMediaContentcontent=new NotificationRequest.NotificationMediaContent();//設(shè)置通知標(biāo)題content.setTitle(title);//設(shè)置通知標(biāo)題content.setText(text);//設(shè)置媒體通知待展示的按鈕content.setShownActions(newint[]{0});//定義開始按鈕NotificationActionButtonButton=newNotificationActionButton .Builder(getPixelMap(ResourceTable.Media_Play),"開始",null).build();//放置開始操作按鈕request.addActionButton(Button);6.2.6其他通知類型38媒體通知核心代碼如下://通知標(biāo)題Stringtitle="來自NotificationDemo的通知";//通知內(nèi)容Stringtext="通知內(nèi)容:這是一個(gè)測試的媒體通知內(nèi)容";//媒體通知NotificationRequest.NotificationMediaContentcontent=new NotificationRequest.NotificationMediaContent();//設(shè)置通知標(biāo)題content.setTitle(title);//設(shè)置通知標(biāo)題content.setText(text);//設(shè)置媒體通知待展示的按鈕content.setShownActions(newint[]{0});//定義開始按鈕NotificationActionButtonButton=newNotificationActionButton .Builder(getPixelMap(ResourceTable.Media_Play),"開始",null).build();//放置開始操作按鈕request.addActionButton(Button);6.2.7案例:通知的發(fā)布和取消39創(chuàng)建一個(gè)名為NotificationDemo的應(yīng)用來作為演示。頁面需要發(fā)布一個(gè)通知按鈕組件和取消通知按鈕組件,XML文件中的內(nèi)容這里不再贅述。修改MainAbilitySice,其內(nèi)容如下:publicclassMainAbilitySliceextendsAbilitySlice{//定義日志標(biāo)簽

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對(duì)象

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

slot.setDescription("FromNotificationDemo");//設(shè)置振動(dòng)提醒

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

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

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

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

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

NotificationRequest.NotificationNormalContentcontent=newNotificationRequest.NotificationNormalContent();//設(shè)置通知標(biāo)題

content.setTitle(title)//設(shè)置通知標(biāo)題

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

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

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

request.setContent(notificationContent);//設(shè)置通知的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打開遠(yuǎn)程模擬器,運(yùn)行程序,單擊“發(fā)送通知”按鈕,運(yùn)行結(jié)果如下圖所示。Thankyou

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

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

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

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

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運(yùn)作機(jī)制 inteventId=event.eventId;switch(eventId){

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論