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