68

我想在我的库项目的一个类中获取在运行时引用/托管我的库的应用程序的上下文。是否可以?如果是,如何?

谢谢

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

4

5 回答 5

57

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

/**
 * 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() 您的库项目来获取正在使用该库的应用程序的应用程序上下文。

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

于 2011-11-03T16:15:30.860 回答
14

是否可以?

是的。

如果是,如何?

将其作为参数传入。

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

然后弄清楚“[你]如何在 JNI 中获取上下文并将其传递给 Java 层”。我想你会像传递任何其他对象一样传递它。正如@Blundell 指出的那样,您实际上没有任何其他选择。

于 2011-08-23T10:13:45.290 回答
13

jni中还有另外一种获取context的方式,既不是传参数也不是自己保存context,而是使用android api。我发现有一个类名为:

  • android.app.AppGlobals

在源代码中。和静态函数

  • 获取初始应用程序

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

于 2013-11-27T11:11:16.047 回答
1

我会将它作为参数传递或在该库中传递一个单例。

让主应用程序扩展库的应用程序类是一个坏主意,因为在 java 中你只能从一个类扩展一次。如果您的应用程序需要传递到另一个库,您将遇到麻烦。

于 2015-07-20T21:36:47.167 回答
1

根据这篇文章,您可以让库借助ContentProvider.

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

高温高压

于 2019-07-18T09:32:26.293 回答