这可能是一个简单的问题,但我只是想确保我是对的。
在我的Android应用程序中,我有一个使用的构造函数:
activity.getApplicationContext()
活动作为参数传递给构造函数。
问题是我从服务中调用此类。如果我创建第二个构造函数接受服务作为参数并使用service.getApplicationContext
?我会得到相同的应用程序上下文吗?
答案 0 :(得分:56)
获取应用程序上下文的最简单方法是:
创建一个扩展App
android.app.Application
public class App extends Application {
public static Context context;
@Override public void onCreate() {
super.onCreate();
context = getApplicationContext();
}
}
修改您的AndroidManifest.xml
<application>
代码,使其具有android:name="your.package.name.App"
属性。
只要您需要应用程序上下文,只需从App.context
获取。
Application
始终首先初始化,无论您的流程是否运行,无论是活动,服务还是其他内容。您将始终可以访问应用程序上下文。
答案 1 :(得分:8)
我会获得相同的应用程序上下文吗?
是。您可以查看他们提供的Android文档
getApplicationContext()
返回当前进程的单个全局Application对象的上下文。
所以不应该在整个申请过程中改变它。
请注意这一点:
getApplicationContext()
通常只应在需要生命周期与当前上下文分离的上下文时使用,该上下文与进程的生命周期而不是当前组件相关联。 强>
如果我错了,请纠正我。
由于
答案 2 :(得分:2)
只有一个应用程序上下文,因此您应该获得相同的上下文。你可以只有一个带Context
的构造函数,你真的不需要两个。或者,如果您想确保获得应用程序上下文,而不是活动,则可以让构造函数将Application
作为参数Context
。
答案 3 :(得分:1)
如果你想获得整个申请的背景,你可以去getApplicationContext()
。如果您想获得当前课程的上下文,可以使用getBaseContext()
代替。
答案 4 :(得分:1)
我使用非静态直接上下文参考来调整yuku的答案。
创建一个扩展 domain.company.pseudo.ApplicationName
的课程android.app.Application
。
package hypersoft.systems.android;
import android.app.Application;
public class Starbox extends Application {
public static Starbox instance;
@Override
public void onCreate() {
super.onCreate();
instance = this;
}
}
在此示例中,我的完整应用程序包名称为hypersoft.systems.android.starbox
。
现在,修改AndroidManifest.xml <application>
标记以获得属性 android:name="hypersoft.systems.android.Starbox"
,并确保Starbox.java
类文件位于项目组件中目录:android
而不是starbox
。
完成所有这些操作后,您现在可以import hypersoft.systems.android.Starbox
,并且在您的代码中,您可以通过致电ApplicationContext
获取Starbox.instance.getApplicationContext()
使用构建工具26和api 26(Android 8.0)使用min sdk version 14(4.0)成功编译。
答案 5 :(得分:-2)
应用程序上下文添加活动上下文两者都不同.Downcasting是有风险的。使用此代码来使用上下文对象。
public class App extends Application {
public static Context context;
@Override public void onCreate() {
super.onCreate();
context = getApplicationContext();
}
}
在您的活动和片段中:
Conetext context=App.context;