flex4 讀書筆記 chapter 3

轉載自 selina_1113
最終編輯 selina_1113

 

1、默認情況下,swf文件只能向swf文件所在的域提出http或其它網絡請求。如果要仿問swf文件所在的不同的域,即要在目標域的根目錄中放置一個crossdomain.xml文件,設置當前服務器接受的域。

2、mxmlc可以把mxml、as、swc、rsl等文件打包成一個swf文件,而compc可以把mxml、as等編譯成swc或rsl文件。

3、部署文件時,請確保rsl等資源文件是否存在於服務器中以及swf文件指向的rsl的路徑。

4、flashbuilder使用swfobject2類庫把swf放在html中。

5、在網絡安全沙箱內,flash除了ShareObjects外,不能訪問本地的磁盤及資源。在得不到用戶允許的情況下,不能從攝像頭或耳麥中獲取信息併發送到網絡。

6、swf只能訪問網絡或本地資源兩種中的一種。也就是說要麼你把swf設置爲只能訪問網絡,要麼把swf設置爲只能訪問本地資源。設置的選項爲編譯時的use-network=true/false。默認爲true。

7、flex只持基於組件的開發模型。常規的開發方法是先擴展一些基本的UI組件並把你需要的功能封裝在上面,然後再在UI中組裝起來。

8、在開發過程中,你會使用自已開發的自定義組件或外部的自定義組件。默認情況下flashbuilder在項目src及其子目錄下尋找自定義組件。如果你需要使用別的地方的自定義組件,你可以設置source path。flashbuilder除了在src目錄下尋找組件外,還會在source path下尋找自定義組件尋找的順序按source path順序尋找。在as中引用組件,使用import語句。在mxml中,使用命名空間。

9、swc文件是flex的打包文件,常用的as/mxml通用組件會打包成swc文件。通過library-path可以加載swc文件。

10、swf文件被客戶端下載後只保存在瀏覽器的緩存中,瀏覽器關閉後,swf文件可能會被刪除。從swf文件中分離出swc文件以rsl的形式加載可以減swf的體積以及減小每次的下載量。在編譯時可以使用runtime-shared-libraries選項指定rsl的位置。

11、可以把flex應用分成多個模塊(modules)。編譯後,原來的一個swf文件變成多個swf文件,主swf文件在需要時才加載或卸載模塊。

12、在flashbuilder中你可以通過修改配置文件或直接設置command-line argument給編譯器。

13、flex編譯器是區分大小寫的。

14、swf只能訪問自已域保存的ShareObject文件。默認情況下ShareObject的大小爲每個域100k。如果要使用大於100k,程序需要彈出詢問對話框。另外當大於100k時,fp會自動彈出對話框,詢問用戶是否允許超過100k的大小。

15、fp會自動監控程序佔用內存及cpu的情況。如果要長時間佔用大量資源,fp會自動詢問用戶,是否需要關閉應用。

16、fp不會把客戶端的一些私密信息提供給app,例如:帳戶、電話、mail等。但爲了提高app的用戶體驗,fp會提供user agent,系統兼容性(語言,mp3編碼),是否有攝像頭,麥克風。另外fp還可以設置剪帖板的信息,但不會提供獲取剪帖板信息的方法。

17、flash有四種沙箱類型。同一個swf文件在不同的沙箱中有不同的安全限制。

18、遠程沙箱(remote)。所有來自非本地URL的文件(html,swf2html腳本)被放到遠程沙箱中。swf按不同的域被分到不同的沙箱中。

19、本地文件系統沙箱(local-with-filesystem)。本地文件系統沙箱是本地swf文件的默認沙箱。在此沙箱中的swf文件不能訪問遠程主機。

20、本地網絡沙箱(local-with-networking)。本地文件系統沙箱是本地的swf文件具有仿問網絡的權限,但不具備訪問本地文件的能力。

21、本地信任沙箱(local-trusted)。在這個沙箱中的swf沒有權限限制。所有本地的swf文件都可以設置成這種沙箱。設置這種沙箱可以通過交互的方式設置(Settings Manager)或能過非交互方式設置(通過安裝程置增加配置文件)。

22、可以使用編程的方式讀取Security中的sandboxType屬性查看沙箱類型。

23、編譯時的use-network參數及swf下載的地方可以決定沙箱類型。本地的swf文件的use-network設置爲ture是,沙箱類型爲local-with-network,設置爲false時爲local-with-filesystem。遠程下載的swf文件的use-network設置爲true時,沙箱類型爲remote,設置爲false時會報錯。

24、fp客戶端有四種類型。分別爲瀏覽器嵌入式的正式版及調試版和獨立版的正式版及調試版。

25、fp的瀏覽器嵌入式客戶端在不同的瀏覽器中以不同的技術實現,在IE中以ActiveX,在其它瀏覽器中以plug-in實現。在瀏覽器嵌入式客戶端時可以使用一些瀏覽器技術,例如form及ssl。

26、DisableLocalSecurity打開時,swf處於本地信任(local-tursted)安全沙箱中。EnforeLocalSecurity打開時,swf處於其它的三種沙箱中。默認情況下,ActiveX控件是DisableLocalSecurity,plug-in默認爲EnforeLocalSecurity。

27、交互腳本(cross-scripting)。兩個不同的swf文件需要相互訪問時需要使用cross-scripting。只有處於同一個安全沙箱中的swf文件才能使用交互腳本。也就是說當swf處理不同類型的安全沙箱,或處於同一類安全沙箱,但swf文件來自不同域時都不能使用cross-scriptin。

28、來自不同域的兩個swf文件需要cross-script時,可以通過設置Security.allowDomain/allowInsecureDomain方法設置swf文件可以被哪些域仿問。

29、flash.net.Externallnterface是調用外部js(call)及設置被js調用接口(addCallback)的主要類。ExternalInterface的調用權限由包裝它的html設置,主要參數有:allowScriptAccess和allowNetworking。默認情況下,externalInterface被允許調用同域的js。

30、navigateToURL()主要用於打開或替換當前窗口,也可以用於調用外部js。它同樣受限於allowScriptAccess和allowNetworking參數的限制。

31、由瀏覽器打開的swf文件以及在swf中的圖片相關資源會存放於瀏覽器的緩存中。這些文件在瀏覽器關閉後也有可能同樣保留在緩存中。所以你可以通過http報頭設置當瀏覽器關閉時清空這些緩存:cache-control:no-cache,no-store,must-revalidate,max-age=-1 pragma:no-cache,no-store expires:-1

32、可信任的網頁及目錄。瀏覽器本身有一個安全模型。fp會與瀏覽器的安全模型交互,如果瀏覽器把一個網頁設爲可信任的網頁,即fp會把該網頁下的swf文件處於可信任的安全沙箱(local-trusted)中。另外用戶通過fp的User Settings Manager或增加一個FlashPlayerTrust Configuration文件指一個可信任目錄,然後把swf文件放到該目錄下。當打開該swf文件時,該文件也處於可信任安全沙箱中。

33、部署過程中,如果你的swf及資源文件發佈在不同的域中。你除了需要增加crossdomain.xml文件以及在app中調用allowdomain等外。最好還需要把一些通配符(*)設置成具體的域和端口。

34、fp是區分獲取內容(Content)與獲取數據(Data)的。Content與Data的區別是Content一般只用於顯視,而Data可被as處理。獲取內容會比獲取數據的限制小一點。在不同域中獲取的數據或swf文件會被放到不同的沙箱中。

35、向遠程讀取圖片用於顯視時,一般不受限制。但從遠程讀取數據時例如xml時,需要得到遠程的授權及html的受權。

36、LocalConnection可以讓在同一客戶端電腦上的各個swf之間進行方法調用。在調用過程中,一個swf稱爲sender,另一個稱爲listener。最簡單的情況是同一個域中的兩個swf之間的調用。在不同域之間調用需要調用LocalConnection.allowDomain()/allowInsecureDomain()方法。

37、swf是一種開發格式。所以它可能被反編譯,裏面的信息會被別人看到。所以發佈產品前應該放在裏面的敏感信息去調。

38、爲了做到安全,你應該注意以下幾點:一,不要把敏感信息,例如帳戶放在swf內。二、用戶授權驗證、sql等應放在服務端完成。三,如果在使用過程中,swf與server之間傳遞敏感信息,可以考慮使用ssl。

39、安全相關的錯誤事件並不是由目標對像發出來的。所以並不能用常規的.addEventListener方法去處理錯誤而是使用try{}catch(e){}方法是鋪捉。

40、當你使用TextArea或TextInput來輸入密碼時,請把裏面的displayAsPassword屬性設置爲true。

41、在瀏覽器中打開一個flash後,可以右擊-設置。然後對一些權限進行設置。

42、模塊(Module)是一個SWF文件。它可以被一個或多個app調用,但不能單獨運行。

43、模塊比RSL更靈活。它是否被加載由app決定,並且在編譯時不需要被引用。

44、模塊域(Module Domains)。默認情況下,模塊被加載到主app的子域中。這樣出現的問題所有模塊所在域都從屬於主域,但模塊間的域就不相同而且沒有從屬關係。當一個模塊調用一些Manager類後,例如(PopoupManager、DragManager),另一個模塊再調用這些管理類時將出錯。因爲那些管理類屬於它們被第一次調用的域。要解決這個問題的做法是在主app中,初始化這些管理類,然後這些管理類就可以被各模塊共用。

45、如果要獲取最好的交互性,主app與所有模塊最好處於相同的安全沙箱中。

46、創建模塊的步驟。一、mxml:根元素爲<mx:Module>,as:繼承Module/ModuleBase。二,像一般應用一樣編譯它。三、通過<mx:ModuleLoader>標籤或ModuleLoader/ModuleManager類去加載模塊。

47、每個模塊都有它自已的IStyleManager2實例,也就是說每個模塊都有它自已的樣式。各模塊之間的樣式不會相互影響。在主app加載完模塊後,模塊的樣式會與主app的樣式合併,合併的最終結果是模塊的樣式優先級高於主模塊。

48、當你在編譯模塊時使用了isolate-style=false選項時,各模塊間將會共用一個樣式。如果模塊間有相同的樣式,即先被加載的樣式的優先級會高於後加載的模塊樣式的優先級。使用該選項後,可能會出現卸載模塊後模塊不被GC回收等一些情況,因爲有些模塊的樣式可能被其它模塊引用。

49、getStyleDeclarations()只返回定義的樣式,要獲取合併後的樣式需要調用getMergedStyleDeclaration()。運行間設置樣式定義只會影響定義的樣式,該樣式是否起作用取決於合併樣式。

50、StyleManager可用於設置所有元素的樣式。語法如下:StyleManager.getStyleDeclaration("spark.components.Button").setStyle("fontSize",15);

51、模塊的開發方法就像app開發方法一樣,可以使用mxml或as。模塊可以被模塊或app加載。

52、ModuleLoader提供了高層次的加載接口,而ModuleManager提供了加載模塊的底層接口。

53、當你的模塊要用於顯視或用到framework的類,你可以用<mx:Module>標籤或繼承Module類。如果你的模塊不用顯視和framework類,你可以考慮用as繼承ModuleBase類。這樣的模塊體積會減小。

54、默認情況下Module編譯後會包含所有它依賴的類:框架及自定義的類庫。結果就是主類加模塊的體積遠比單獨的app大。

55、在flashbuilder中可以選擇項目-屬性-module然後選擇模塊所屬主類,這樣flashbuilder可以優化模塊的大小。

56、當一個模塊中的類想用另外一個模塊中的類,那就要把模塊中的類的模塊域提高到app中。

57、如果在air中使用模塊。那模塊必需和主類在同一目錄或在主類的子目錄中。

58、ModuleLoader語法。<mx:ModuleLoader url="com/humanmonth/ColumnCharModule.swf"/>。你需要設置的主要是url。你可以在需要時才設置url,設置後fp纔會去加載它。當你設置或重新設置url時會觸發ModuleLoader的loadModule()方法,當你把url設置爲“”,ModuleLoader會卸載模塊。另外你也可以手動調用ModuleLoader的loadModule/unloadModule方法。

59、無論你調用多少次loadModule(),fp保證對一個module,一個ModuleLoader只會加載一個實例。

60、ModuleManager提供了低層次的加載module的接口。在用ModuleManager加載接口時要注意,module對像要放在類屬性中,以免被GC回收。

61、如果模塊分散在不同的服務器中。你需要解決一些權限問題。Security.allowDomain("remoteservername");Security.loadPolicyFile("Http://remoteservername/crossdomain.xml");new URLLoader(new URLRequest("http://remoteservername/crossdomain.xml"));loader.load(request);

62、把一個app分開多個module的一個好處是主app的尺寸變小了,第一次加載app的時間縮短。但另一個問題是當用戶使用到模塊時,模塊加載也需要時間。解決這個問題的一個途徑是預加載模塊。預加載模塊的

代碼:var info:IModuleInfo=ModuleManager.getModule("url");info.addEventListener(ModuleEvent.READY,fun);info.load();

63、ModuleLoader就很多事件。你可以擴展它實現自定義的加載類,例如增加一些顯視加載進度,圖片等效果。讓整個系統有一個統一的加載效果。

64、通過相關屬性引用實現app與module間方法相互調用。這種方法會造成app與module的強耦合和因爲代碼的引用使得app與module的尺寸增大。但好處是簡單直接。方法如下:一,ModuleLoader.child屬性。代碼:(moduleloader1.child as ChildModule1).fun。二,如果你用ModuleManager加載模塊,可以通過以下代碼獲取模塊module.factory.create() as MyModule。三,通過module.parentApplication方法引用父應用。四,模塊間調用,先用module.parentApplication得到父應用再調用相應的child或factory屬性。

65、通過模塊的url參數傳遞數據。 module中有一個loaderInfo屬性,裏面可以獲取調用它的url。你可以從字符串中找到信息。

66、模塊與app間的相互調用最靈活的方式是讓app或module實現自已定義的接口,然後把app或module轉型爲接口後調用。這樣app與module間處於低耦合狀態。

67、使用子應用(sub-applications)有以下好處:減小主應用的體積;按功能封裝代碼;增加可重用性;整合第三方子應用。

68、對主應用來說,子應用分爲可信子應用和不可信子應用。當主應用與子應用基於相同版本的庫架構建時具有良好的交互性。如果子應用的庫版本較主版本的低,即交互性有一定的限制。

69、子應用的可信級別及版本取決於應用域(application domain)及安全域(security domain)。

70、有三種類型的子應用:1,單版本應用。2,多版本應用。3,沙箱應用。

71、應用域(application domain)是存放類定義的一個容器【類似於java的classloader】。一個應用有一個頂層應用域-system domain。應用域是system domain的一個子域。當你載入一個子應用時,你可以選擇把它載入三種域:兄弟域(sibling application domain),子域(child application domain),當前域(current application domain)。

72、默認情況下SWFLoader/Loader控件把子應用載到子域中。如果當前應用與子應用所基於的類庫版本不同時,載入後會出現錯誤。如果主與子應用基於不同的庫版本,你應該把子應用載入到兄弟域中。

73、使用SWFLoader加域子應用時,把loadForCompatibility屬性設置爲true時,SWFLoader會把子應用加載到兄弟域中,反之,加載到子域中。

74、system domain是最頂層的域。共用的域(playerglobal.swc)被加載到此域中。父域已經存放的類定義,子類不會重複加載。

75、基於不同版本類庫的應用應加載到兄弟域中,否則會出錯。

76、一般RSL與編譯時的資源會被加載到當前域中,SWFLoader一般不會把子應用加到當前域。

77、安全域定義了應用的可信級別。多個應用的可信程序越高,它們的交互性越強。

78、如果子應用與主應用屬於相同域名下載的,默認情況下它們處於同一個安全域。反之,需要設置SWFLoader的trustContent爲true讓兩者處於相同的安全域。

79、沙箱應用(sendboxed applications)之間有很多限制。包括不能仿問state對像,不能接收mouse事件,不能調用其它app的畫圖,不能訪問訪問其它app的一部份屬性。

80、大應用、混合編程、一些工具類都會使用子應用的方式加載。

81、沙箱應用(sandboxed application)。當你需要加載一些不可信的第三方swf文件,且主swf與子swf所依賴庫的版本不一致。這種情況下把子swf以兄弟域的型式加載到主swf中。我們把這種情況叫沙箱應用。

82、上面所提及到的所有類型的子應用都應符合條件:主應用依賴的庫要比子應用依賴的庫新或相同。

83、主app加載來自不同域名的子app的情況,我們稱爲import loading。

84、採用模塊與子應用有以下區別:因爲模塊與主應用共享類定義,所以文件尺寸會小一點。模塊與主應用的耦合性高一點。模塊與 主應用要使用同一版本的庫而子應用沒這個要求。模塊一般會在主應用的子應用域中,所以管理類共享。模塊只能加載到主應用的子應用域中,而子應用可以載進主應用的兄弟應用域或子域。模塊只能放進安全模,而子模塊既可放進安全域也可放進不安全域。

85、SWFLoader與Loader的區別。SWFLoader是Loader上的一個封裝,使用起來更簡單,且提供了一些額外功能,例如支持樣式與效果,可以監控加載進度,被加載的swf文件可以是多版本的。

86、誇域交互時,建議採用事件機制進行。

87、沙箱應用與多版本應用在編譯時應加上以下參數:-include=mx.managers.systemClasses.MarshallingSupport。

88、子應用可以獨立運行。它不應依賴主應用以及兄弟應用。

89、設置SWFLoader時可以單獨設置loadContext或直接設置loadForCompatibility和trustsContent。loadContext的優先級要高於後者。以上屬性應SWFLoader加載前設置。

90、LoadContext對像有兩個屬性,一個爲securityDomain另一個爲applicationDomain。如果不設置securityDoamin時,子應用會採用它自已的的安全域。如果要把子應用設置成可信域,即使用以下語句:context.securityDomain=SecurityDomain.currentDomain。設置applicationDomain時可以設置三個值:new ApplicationDoamin():兄弟域,new ApplicationDomain(ApplicationDomain.currentDomain):子域。application.currentDomain:當前域。最後要注意的是同一個LoadContext不要用於加載多個應用。

91、卸載子app時可以使用loader.unloadAndStep(true)或loader.source=null。另外,當loader再load一

個子app時,上一個app會被自動卸載。

92、在可信任的單版本的子app中,子app可能通過application或parentDocument訪問主app。

93、主app訪問子app的方法:(contentLoader.content as SystemManager).application as SubApp2。

94、如果主應用要加載子應用中的類,那子應用一定要和主應用處在同一個安全域及相同的版本。加載的方法爲new UIComponent(new (loader.loaderContext.applicationDoamin.getDefinition('ClassName') as Class)());。訪問相關屬性 obj['property']。 

95、在sandboxed application中,除了FocusManager外,其它的Manager,例如DragManager、ToolTip、Alert、指針等的效果都只在子app中出現,主app不受這些效果的影響。

96、相同安全域的主從應用可彈出框、ToolTip、鼠標不限於子應用區域。

97、Bootstrap 是一個輕量級的類容器。它先於主應用被加載,所以由它加載的類可以在各應用在共享。一般情況下,一個安全域可以用一個bootstrap。因爲bootstrap加載的類不能在不同的安全域間共享。

98、如果子應用需要使用rpc,那rpc相關類一般會由Bootstrap加載。

99、BABridge(Flex Ajax Bridge)是一個簡單的類庫,用於js與as間的相互調用。利用ExternalInterface類也可以實現相關功能,但需要編寫複雜的代碼及限制比較多。

100、BABridge的地址在sdk_installation_dir/frameworks/javascript/fabridge下。如果你使用FlashBuilder,你可以直接右擊項目,選擇:Create Ajax Bridge。你需要在mxml中加入<fab:FABridge xmlns:fab-"bridge.*"/>。完成後,你就可以在js中直接使用FABridge.flash.root()引用flash的主類。

101、獲取加載swf人url人代碼:mx.core.FlexGlobals.topLevelApplication.url。

102、獲取客戶端信息的類:flash.system.Capabilities。從中可以獲取客戶端操作系統,播放器,語言等。

103、ExternalInterface是as與js互相調用的主要類。其中主要方法有兩個:call()/addCallback()。ExternalInterface受安全沙箱的限制,它受限於swf的引入代碼中allowScriptAccess/allowNetworking屬性的值。

104、在初始化階段,我們一般需要向swf文件傳一些參數。我們可以通過htmlwraper中的flashVars、swf的url參數、swf初始化後通過ExternalInterface調用js獲取頁面中的參數。三者相比,通過url傳參比較簡單。

105、通過靜態方法ExternalInterface.call(funName,para... paras)調用js。

106、flash.net.navigateToURL()可用於調用js,也可用於打開新窗口。

107、URLLoader用於後臺向服務器發出請求,而navigateToURL()用於調用瀏覽器的窗口加載頁面。

108、navigateToURL(req:URLRequest,window:String)用法。window的值所代表的意思:_self:在本窗口打開,_blank:本窗口之上彈出,_parent:在父窗口打開,_top:最頂層窗口打開。

109、navigateToURL調用js:navigateToURL(new URLRequest("javascript:fun()","_self");

110、在swf的html包裝器中allowScriptAccess的選項有三個:never,sameDoamin,always.

111、一些公用的類加、資源可以打包成RSL(Runtime Shared Libraries)。RSL被下載到客戶端後可以被多個應用共享使用。

112、有三種類型的RSL:Framework:官方標準庫,可被任意應用使用。Standard:自已打包的應用,可被相同域的應用使用。Cross-domain:在Standard的基礎上可被任意域使用。Framework與後兩者的另一個區別在於簽名的Framework(swz)存放在fp相關目錄下,而後兩者存放在瀏覽器的緩存中。另外要注意的是非簽名的framework(swf)也存放在瀏覽器緩存中。

113、flex編譯時分靜態鏈接與動態鏈接兩種。如果使用靜態鏈接,flex在編庫時把相關庫和應用打包成一個文件。靜態鏈接的特點是文件很大。與靜態鏈接相關的編譯參數爲有四個library-path,include-libraries,includes,source-path。前面四個參數中包含include關鍵字的參數是把關聯的所有庫打包進主應用中,而沒有include的是把相關聯的類打包進主應用中。動態鏈接是讓應用在需要用到相關類時才加載。模塊、運行時樣式表、RSL都使用動態鏈接技術。在flash builder中你可以從Project-Properties-Flex Build Path-Library Path中 設置link Type。

114、使用動態鏈接時,需要在編譯中加入參數:runtime-shared-library-path,runtime-shared-libraries,external-library-path,externs,load-externs。

115、sdk/frameworks/libs下以swc結尾的庫爲編譯時使用的。sdk/frameworks/rsls下以swf結尾的爲unsign庫,swz結尾的爲sign庫。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章