Context可能是Android應用中最常用的元素,而它也可能是最容易誤用的。
Context物件是如此常見和傳遞使用,它可能會很容易產生並不是你預期的情形。載入資源、啟動一個新的Activity、獲取系統服務、獲取內部檔案路徑以及建立view(其實還遠不止這些)統統都需要Context物件來完成。我(原文作者)想做的只是給大家提供一些Context是如何工作的見解,以及讓大家在應用中更有效的使用Context的技巧。
Context的型別
並不是所有的context例項都是等價的。根據Android應用的元件不同,你訪問的context推向有些細微的差別。
Application - 是一個執行在你的應用程序中的單例。在Activity或者Service中,它可以透過getApplication()函式獲得,或者人和繼承於context的物件中,透過getApplicationContext()方法獲得。不管你是透過何種方法在哪裡獲得的,在一個程序內,你總是獲得到同一個例項。
Activity/Service - 繼承於ContextWrapper,它實現了與context同樣API,但是代理這些方法呼叫到內部隱藏的Context例項,即我們所知道的基礎context。任何時候當系統建立一個新的Activity或者Service例項的時候,它也建立一個新的ContextImpl例項來做所有的繁重的工作。每一個Activity和Service以及其對應的基礎context,對每個例項來說都是唯一的。
BroadcastReciver - 它本身不是context,也沒有context在它裡面,但是每當一個新的廣播到達的時候,框架都傳遞一個context物件到onReceive()。這個context是一個ReceiverRestrictedContext例項,它有兩個主要函式被禁掉:registerReceiver()和bindService()。這兩個函式在BroadcastReceiver.onReceive()不允許呼叫。每次Receiver處理一個廣播,傳遞進來的context都是一個新的例項。
ContentProvider - 它本身也不是一個Context,但是它可以透過getContext()函式給你一個Context物件。如果ContentProvider是在呼叫者的的本地(例如,在同一個應用程序),getContext()將返回的是Application單例。然而,如果呼叫這和ContentProvider在不同的程序的時候,它將返回一個新建立的例項代表這個Provider所執行的包。
Context可能是Android應用中最常用的元素,而它也可能是最容易誤用的。
Context物件是如此常見和傳遞使用,它可能會很容易產生並不是你預期的情形。載入資源、啟動一個新的Activity、獲取系統服務、獲取內部檔案路徑以及建立view(其實還遠不止這些)統統都需要Context物件來完成。我(原文作者)想做的只是給大家提供一些Context是如何工作的見解,以及讓大家在應用中更有效的使用Context的技巧。
Context的型別
並不是所有的context例項都是等價的。根據Android應用的元件不同,你訪問的context推向有些細微的差別。
Application - 是一個執行在你的應用程序中的單例。在Activity或者Service中,它可以透過getApplication()函式獲得,或者人和繼承於context的物件中,透過getApplicationContext()方法獲得。不管你是透過何種方法在哪裡獲得的,在一個程序內,你總是獲得到同一個例項。
Activity/Service - 繼承於ContextWrapper,它實現了與context同樣API,但是代理這些方法呼叫到內部隱藏的Context例項,即我們所知道的基礎context。任何時候當系統建立一個新的Activity或者Service例項的時候,它也建立一個新的ContextImpl例項來做所有的繁重的工作。每一個Activity和Service以及其對應的基礎context,對每個例項來說都是唯一的。
BroadcastReciver - 它本身不是context,也沒有context在它裡面,但是每當一個新的廣播到達的時候,框架都傳遞一個context物件到onReceive()。這個context是一個ReceiverRestrictedContext例項,它有兩個主要函式被禁掉:registerReceiver()和bindService()。這兩個函式在BroadcastReceiver.onReceive()不允許呼叫。每次Receiver處理一個廣播,傳遞進來的context都是一個新的例項。
ContentProvider - 它本身也不是一個Context,但是它可以透過getContext()函式給你一個Context物件。如果ContentProvider是在呼叫者的的本地(例如,在同一個應用程序),getContext()將返回的是Application單例。然而,如果呼叫這和ContentProvider在不同的程序的時候,它將返回一個新建立的例項代表這個Provider所執行的包。