获取应用程序上下文

时间:2011-08-22 07:12:01

标签: android android-activity service android-context

这可能是一个简单的问题,但我只是想确保我是对的。

在我的Android应用程序中,我有一个使用的构造函数:

activity.getApplicationContext()

活动作为参数传递给构造函数。

问题是我从服务中调用此类。如果我创建第二个构造函数接受服务作为参数并使用service.getApplicationContext?我会得到相同的应用程序上下文吗?

6 个答案:

答案 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;