是否可以在Android库项目中获取应用程序的上下文?

时间:2011-08-23 07:17:50

标签: android android-context android-library

我想获得在我的库项目的一个类中运行时引用/托管我的库的应用程序的上下文。可能吗?如果是,怎么样?

由于

更新 我不希望我的用户将参数中的上下文传递给我的库项目,因为我的库项目可能会通过JNI调用,我不知道如何在JNI中获取上下文并将其传递给Java层。

6 个答案:

答案 0 :(得分:52)

还有一种方法,在库项目中添加应用程序类:

/**
 * Base class for those who need to maintain global application state.
 */
public class LibApp extends Application {

  /** Instance of the current application. */
  private static LibApp instance;

  /**
   * Constructor.
   */
  public LibApp() {
    instance = this;
  }

  /**
   * Gets the application context.
   * 
   * @return the application context
   */
  public static Context getContext() {
    return instance;
  }

}

然后在常规项目中使真正的应用程序类扩展LibApp:

/**
 * Base class for those who need to maintain global application state.
 */
public class App extends LibApp {

  @Override
  public void onCreate() {
    super.onCreate();
  }

}

确保您在AndroidManifest中定义了“名称”:

<application android:name="App" ...>

并且您的App类位于基础包中。

然后,您可以使用LibApp.getContext()库项目来获取正在使用该库的应用程序的应用程序上下文。

这可能不是一个好的解决方案,但它对我有用。 我正在分享它,因为它可能对其他人有用。

答案 1 :(得分:12)

  

有可能吗?

  

如果是,怎么样?

将其作为参数传递。

  

我不希望我的用户将参数中的上下文传递给我的库项目,因为我的库项目可能会通过JNI调用,我不知道如何在JNI中获取上下文并将其传递给Java层

然后弄清楚“你如何在JNI中获取上下文并将其传递给Java层”。我会想象你会像任何其他物体一样传递它。正如@Blundell所说,你真的没有其他选择。

答案 2 :(得分:9)

还有另一种方法可以在jni中获取上下文,既不传递参数也不自己保存上下文,而是使用android api。      我发现有一个名为:

的类
  • android.app.AppGlobals

在源代码中。和静态函数

  • <强> getInitialApplication

    可以返回Application个对象。但它必须在主线程中调用,并且该类是隐藏的。  无论如何,你可以通过反映在java中使用它。您可以使用FindClass()FindStaticObjectMethod()找出方法并使用它。  希望有所帮助。

答案 3 :(得分:0)

在您的库项目中,为主项目添加依赖项。在IntelliJ中,当您尝试引用此全局变量时,它将为您执行此操作。在Eclipse中我不确定......

答案 4 :(得分:0)

我会将其作为参数传递或将其传递给该库中的单例。

让主应用程序应用程序扩展库的应用程序类是一个坏主意,因为在Java中你只能从类扩展一次。如果您的申请需要转到另一个图书馆,您将遇到麻烦。

答案 5 :(得分:0)

根据this post,您可以借助ContentProvider让库使用应用程序上下文自动初始化。

无论如何,要小心,如post comments中所述,在加载时间和即时运行以及多进程应用程序崩溃方面可能存在缺陷。

HTH