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

时间:2019-03-05 03:20:35

标签: java android kotlin static android-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;
  } 

3 个答案:

答案 0 :(得分:3)

  

如果我可以使上下文静态,我会感到困惑。有副作用吗   呢?

您可以将上下文声明为静态,但是在Android中不建议使用,因为这可能会导致应用程序内存泄漏。

  

还有什么其他方法可以不用使用资源来访问我的资源   上下文?

否,您需要一个上下文实例来访问应用程序中的资源。

回到您的情况,最简单的方法是将上下文作为方法的参数传递。

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;
}

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

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

答案 1 :(得分:0)

在Kotlin中,您可以通过创建一个扩展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

在任何地方访问上下文

关于存储静态上下文的问题,如果要存储活动或片段上下文,则可能会造成内存泄漏,但是由于我们存储的是与整个应用程序生命周期相关的应用程序上下文,内存泄漏不会有任何问题。

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

答案 2 :(得分:-2)

1)创建扩展应用程序的App类

private static Context context;

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

2)创建getApplicationContext()方法,该方法返回上下文

public static Context getApplicationContext() {
  return context;
}

3)现在,您可以在类中的任何地方获取上下文,例如

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