2010-12-10 35 views
17

我有一個類需要獲得對其應用程序AssetManager的引用。這個類不擴展任何類型的UI類,所以它沒有getContext()方法或類似的東西。有沒有某種靜態的Context.getCurrentApplicationContext()類型的方法?如何獲取AssetManager而不參考上下文?

澄清:我的課程旨在用作圖書館,用於其他應用程序。它沒有關聯AndroidManifest.xml或控制調用它的上下文。

回答

20
  1. 創建的Application一個子類,例如public class App extends Application {
  2. 坐落在AndroidManifest.xml<application>標籤的android:name屬性指向你的新類,例如android:name=".App"
  3. 在您的應用程序實例的onCreate()方法,你的情況下(例如this)保存到一個名爲app一個靜態字段,並創建一個返回該領域的靜態方法,例如getApp()

這是它應該如何看:

public class App extends Application{ 

    private static Context mContext; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     mContext = this; 
    } 

    public static Context getContext(){ 
     return mContext; 
    } 
} 

現在你可以使用:App.getContext()每當你想獲得一個上下文,然後getAssetManager()(或App.getContext().getAssetManager())。

+0

爲了澄清,我的課程旨在用於像其他應用程序一樣的庫。它沒有關聯的AndroidManifest.xml。 – ab11 2010-12-10 17:42:36

+0

在這種情況下,在應用程序中創建資產管理器並將其傳遞給庫(通過方法或構造函數)。 – Cristian 2010-12-10 18:33:25

+2

看到我打算讓圖書館在其應用程序中被其他開發人員使用,我希望能有一種替代方法來要求他們手動設置資產管理器。 – ab11 2010-12-10 19:14:56

7

我不確定OP問題的最佳答案。不過,我不知道你有使用靜態上下文時要非常小心,建議在Android developer resources

在您的應用程序實例的onCreate()方法(例如本)保存上下文靜態字段命名的應用並創建一個返回該字段的靜態方法,例如getApp()

使用靜態上下文可能泄漏到泄漏的內存問題,特別是如果靜態上下文用於引用視圖。

+0

在Cristian的回答中,這個問題是針對應用程序實例本身的,這正是存儲在mContext中的內容。應用程序實例的壽命與您的應用程序相同;沒有什麼可以「泄漏」。 **如果需要訪問用戶界面,關注確實變得非常重要**;在這種情況下,一個'Activity'將作爲上下文傳入,並且讓該活動在onPause和onDestroy中另外調用「取消註冊」本身很重要。當需要活動上下文時,請參閱http://stackoverflow.com/a/13994622/199364瞭解這種技術。 'static WeakReference mContext'也可能有幫助。 – ToolmakerSteve 2015-10-08 02:41:19