知識社群登入
位置: 艾鍗學院 Blog > 專業論壇 > 討論
[Android技術問題] Difference Context & Activity
1樓
Hello Jarey,

 有時當我們要用到activity類時到底要引用activity class 時到底要引用context好還是activity呢,這二者之間到底有和差異呢?

Thank you
小K
2樓
Context是一個抽像類別,而Activity則是繼承此抽像類別的實作。你可以從Google API中查到此繼承結構
java.lang.Object
   ↳android.content.Context
    ↳android.content.ContextWrapper
     ↳android.view.ContextThemeWrapper
      ↳android.app.Activity
在我們先前上課的Java講義中有提到過多形與繼承的概念,Context對應的實作子類相當多,你也可以在往下繼承去擴充其功能(例如在ListActvity,TabActivity這些都是) ,因為框架上層的函式庫與架構在設計時,並無法得知其底下的實作應用程式的人會如何去設計函式數與名稱,也無法得知你會用什麼名稱去命名你新的類別。但框架它只需要保證框架上層所需要用到的所有函式其子類別都有實作,得以呼叫的到,因此在框架以上的程式你會發現有許多都是抽像的類別,因為Android大量使用了軟體工程中的IoC(控制反轉)技巧,所有許多流程架構都是由框架規範好,底層的類別負責去實作,並利用Java多形的概念,實作的類別可以轉換框架本身可以認得操作的形別,並由框架去控制呼叫那些抽像的函式實作,並因為Java繼承結構具有Override(覆寫)的概念,上層框架就會依流程去控制呼叫你底層的Override實作函式。 

所以就算你傳遞的是一個你自己繼承實作的MyActivity extends Activity, 其實在你傳遞上去時系統己經自動為你的類別做了轉形,將MyActivity轉形為Context(如果接收端的函式參數形別是Context的話),因為由子類別往上轉父類別是可以自動轉形的,這點在Java課程講議中另有詳細的說明,這邊我就不在多加詳述。
3樓
Hello Jarey,

Thank you for your replay !

所以當我們設計一個方法當要引入參數(Activity or Service 等)時都設定為Context 而不設定為 Activity 是比較好是嗎?

小K
4樓
沒有什麼好與壞的問題,要看你的應用方式,這是繼承與多形的概念,你可能需要先了解多形的應用才能清濋你所

需要的軟體架構設計。


Activiy是最底層的子類別,能存取所有父類別的函式,但是目對的類別就比較死,因為己經是繼承樹裡的最底層了

,如果你的接收參數寫死為Activity,那麼就只有Activity與其在底下的子類別(如果還有繼承的話),可以傳遞進去

,若你接收參數用的是繼承樹裡較高層的抽像類別,(例如Contex),那麼所有在Context底下實作的類別都可以

透過自動轉形傳入。 當然我這只能大概用最簡單的說明,實際上還包含了許多細節需要整體的去搭配設計,

(介面、抽像類別、存取修飾詞,軟體架構...)。

建議你可以先從Java Design Pattern方面的書藉去看,看完後接著在看Practical Java 或是 Refactoring-

Improving The Design of Existing Code, 還有一本: Effective Java 這都是在在談討軟體架構與最佳

化寫法相關的書藉。


5樓
Hello Jarey,

First, thank you for your reply !

請問一下Java Design Pattern是否可以推薦一本呢?

Thank you
小K
6樓
台灣出的書來說,我個人認為寫的最優的是博碩出的
Design Patterns於Java語言上的實習應用 增訂第二版

Java Multithread Design Pattern-Java多執行緒與平行處理

這兩本永遠都不會過時,買來放個十幾年都還是可以用,不過好像己經絕版了,或許

可以去網拍看有沒有二手的,或是去圖書館借看看.
7樓
你可以參考這篇文章: