工具類需訪問資源、啟動 Activity、彈 Toast、獲取系統服務等,需 `Context`。
public class Utils {
public static void showToast(Context context, String msg) {
if (context != null) Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
}
public static void startActivity(Context context, Class> clazz) {
if (context != null) {
Intent intent = new Intent(context, clazz);
context.startActivity(intent);
}
}
}
// 調用
Utils.showToast(MainActivity.this, "Hello");
Utils.startActivity(this, SecondActivity.class);
// 危險!導致 Activity 無法被 GC 回收 → 內存洩漏
public class BadUtils {
private static Context sContext;
public static void init(Context context) { sContext = context; }
}
public class App extends Application {
private static Context sAppContext;
public static Context getAppContext() { return sAppContext; }
@Override public void onCreate() { super.onCreate(); sAppContext = this; }
}
// 工具類用 App.getAppContext(),生命周期隨進程,不洩漏
能傳就傳,不能存。優先方法參數傳 `Context`,長期持有只存 `Application Context`,嚴禁靜態字段持有 `Activity Context`。