android使用中的程式——Activity,承載著View,很類似於MVC中的Controller。
不得不說,使用Intent(意圖)來實現Activity與其他組件(包括其他Activity、Service。Broadcast等)進行互動。是Google的一大創新,也是android的一個亮點,這很好地減少了開發的複雜性。就像一個統一的互動介面一樣,或者簡單的說,Intent就是一個定義各個組件之間通訊的標準。說實話,在學Android的時候我總是喜歡將它與.net的win form開發進行對比學習,並且他們之間也確實存在著諸多共性。但是在各個組件之間的互動上,顯然還是android的這種機制來得直觀和方便。但是,也許因為開發出的程式的運行模式有所區別,所以才導致了這樣的局面。
這裡就談談在應用程式的兩個Intent之間採用Intent進行互動,如果你熟悉activity的生命週期,會知道,從一個activity切換到另一個activity(暫且我們將前一個稱之為父activity,後一個稱之為子activity)。父activity會執行OnPause()->OnStop(),之後會執行子activity的OnCreate()->OnStart()等等。但是當你按“返回”的時候,你會發現子activity執行了Ondestory()方法,而不是只執行到OnStop(),也就是子activity此時已經被銷毀,而下一次你在切換到該類型的activity的時候,又會產生一個新的執行個體。而返回之後,父activity會執行OnRestart()等。也就是說,父activity的執行個體一直存在,在返回的時候也不需要再調用OnCreate()。
當你再做一個實驗,在上面的子activity裡,再切換到一個新的activity。你會發現此時,子activity像上面的父activity一樣未被destory。也就是如果一個activity作為另一個activity“源”,那麼它的生命週期肯定比它跳轉到的activity的生命週期長。那麼android到底是怎麼做的呢。我們很容易聯想到一種資料結構——棧。其實,每次startActivity()都只是把“意圖”希望啟動的一個activity壓入棧頂。這樣,就可以實現,棧頂的activity先消亡,其下面的activity在它Pop()之後才會再次Restart。這也很符合程式邏輯。
PS:要想測試activity的lifecycle,只需要重新activity的生命週期會盡量的那些方法(API中有介紹),在方法中啟用日誌記錄功能(Log.i();),記錄相關日誌即可。
java與.net:
看代碼的時候發現java中有這樣的文法:類命.this、類名.class。一個是引用類的一個執行個體,一個是引用該類的Class類型的對象(在.net中應該對應的是類型的定義,也就是中繼資料)。類名.class都是Class類型,class與Class不是同一個類型,這種用法通常在反射中。好吧,這和.net中的Type很相似。可能是先入為主吧,我始終還是覺得稱為Type更為合理,一個類型的“原型”本來在英文中用“Type”來表示。並且Class給人的感覺,總是和class相混淆。
上次看到一個面試題:.net中class是什麼類型?坑爹啊!是類類型嗎?參考型別嗎?尼瑪就是C#的關鍵字!這題考Java程式員,是什麼效果?應該會比.net程式員好~