activity 中的 Android 上下文可以是静态的吗?

Can an Android Context inside an activity be static?

我有一个静态函数,我需要在其中访问我的颜色资源。为了访问颜色资源,我需要静态的上下文变量。如果我可以使上下文静态,我会感到困惑。它有任何副作用吗?或者,有没有其他方法可以在不使用 context

的情况下访问我的资源

这是函数

 private static SpannableStringBuilder setTextColor(
      SpannableStringBuilder Text, int spanLength, boolean isSuggestion) {
    addressText.setSpan(
        new ForegroundColorSpan(
            context
                .getResources()
                .getColor(
                    isSuggestion ? R.color.blur: R.color.red)),
        addressText.length() - 1 - spanLength,
        addressText.length(),
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    return Text;
  } 

1) 创建您的应用程序 class 扩展应用程序

private static Context context;

@Override
public void onCreate() {
    super.onCreate();
    context = getApplicationContext();

2) 创建 getApplicationContext() 方法,其中 return 上下文

public static Context getApplicationContext() {
  return context;
}

3) 现在您可以在 class 中的任何位置获取上下文,例如

Context context = App.getContext().getApplicationContext();

在 Kotlin 中,您可以通过创建 class 扩展 Application 并将应用程序上下文存储在伴随对象中来实现此目的。

通常看起来类似于:

class App : Application() {

    override fun onCreate() {
        super.onCreate()
        instance = this
    }

    companion object {
        private var instance: App? = null
        val context: Context?
            get() = instance?.applicationContext
    }
}

并且您可以通过 App.context

在任何地方访问上下文

关于您对存储静态上下文的担忧,如果您正在存储 activity 或片段上下文,那么您可能会造成内存泄漏,但由于我们正在存储与整个应用程序的生命周期,不会有任何内存泄漏问题。

如果您想编写依赖于静态上下文的可测试代码,您可能 运行 遇到问题,在这种情况下,我建议您将上下文传递给函数而不是直接访问它。

I am confused if I can make context static. Is there any side effects to it?

您可以将上下文声明为静态,但在 Android 中不推荐这样做,因为它可能会导致您的应用程序发生内存泄漏。

is there any other way I can access my resources without using context?

不,您需要上下文实例才能访问应用中的资源。

回到你的案例,最简单的方法是传递上下文作为方法的参数。

private static SpannableStringBuilder setTextColor(Context context, SpannableStringBuilder Text, int spanLength, boolean isSuggestion) {
    int color = context.getResources().getColor(isSuggestion ? R.color.blur : R.color.red);

    addressText.setSpan(new ForegroundColorSpan(color),
            addressText.length() - 1 - spanLength,
            addressText.length(),
            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

    return Text;
}

例如,在您的 activity 中,在调用 setTextColor 时将 this 作为上下文传递。

setTextColor(this, new SpannableStringBuilder(), 0, false);