首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 靜態取得 Context:Application 子類別單例模式最佳實務

     編輯:程式設計綜合問答

需求:在非 Activity/Service 元件(如工具類、靜態方法、第三方庫回調)中取得 Context。標準做法是**自訂 Application 子類別並在單例中持有 Context**。

完整實作步驟

1. 建立自訂 Application 類別


public class MyApplication extends Application {
    private static Context sContext;

    @Override
    public void onCreate() {
        super.onCreate();
        sContext = getApplicationContext(); // 應用層級 Context,生命週期最長
    }

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

2. 在 AndroidManifest.xml 註冊


<application
    android:name=".MyApplication"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">
    <!-- Activities... -->
</application>

3. 任何地方靜態取得 Context


// 工具類
public class Utils {
    public static void showToast(String msg) {
        Toast.makeText(MyApplication.getContext(), msg, Toast.LENGTH_SHORT).show();
    }
    
    public static SharedPreferences getDefaultPrefs() {
        return PreferenceManager.getDefaultSharedPreferences(MyApplication.getContext());
    }
}

關鍵設計決策解析

決策點推薦做法理由
儲存哪種 ContextgetApplicationContext()生命週期等同進程,不會洩漏 Activity、不受佈局膨脹影響
單例存取方式靜態方法 getContext()簡單、無鎖、編譯期可見
是否需同步不需onCreate() 在主執行緒單次執行,先於任何元件建立
是否可為 null理論上不可但建議加 @Nullable 註解,呼叫端做空檢

常見誤區與風險

  • ❌ 儲存 Activity Context:導致 Activity 無法被 GC 回收(記憶體洩漏)。
  • ❌ 在 static 區塊初始化:static { sContext = ... } 會在類別載入時執行,早於 Application.onCreate(),必定為 null。
  • ❌ 單元測試環境無 Application:Robolectric / JUnit 測試需自行模擬或使用 ApplicationProvider.getApplicationContext()。

現代替代:依賴注入 (Hilt / Koin)

大型專案建議使用 **Hilt (Dagger)** 或 **Koin** 管理 Context 依賴:


// Hilt
@AndroidEntryPoint
public class MyService extends Service {
    @Inject Context context; // 自動注入 Application Context
}

// Koin
class MyRepository @Inject constructor(@Suppress("UNUSED_PARAMETER") @Context context: Context)

優點:編譯期檢查、易測試、支援作用域、避免全域單例濫用。

總結

  1. 中小專案:自訂 Application + 靜態 getContext() 簡單有效。
  2. 大型專案/團隊:導入 Hilt/Koin 依賴注入,統一管理 Context 與其他依賴。
  3. 永遠儲存 ApplicationContext,勿存 Activity Context。
  4. 單元測試環境需額外處理 Context 來源。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved