繁体   English   中英

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

[英]Is it possible to get application's context in an Android Library Project?

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

谢谢

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

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

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

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

可能吗?

是的。

如果是,如何?

将其作为参数传入。

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

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

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

  • android.app.AppGlobals

在源代码中。 和静态函数

  • 获取初始应用程序

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

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

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

根据这篇文章,您可以让库在ContentProvider的帮助下使用应用程序上下文自动初始化。

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

高温高压

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

科特林版本。 就我而言,这篇文章帮助了我。 主应用程序模块将上下文传递给库伴随对象上下文变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM