是否可以获得应用程序';Android库项目中的上下文?

是否可以获得应用程序';Android库项目中的上下文?,android,android-context,android-library,Android,Android Context,Android Library,我想获得在运行时在我的库项目的一个类中引用/托管了我的库的应用程序的上下文。可能吗?如果是,如何进行 谢谢 更新 我不希望我的用户将参数中的上下文传递给我的库项目,因为我的库项目可能会通过JNI调用,我不知道如何在JNI中获取上下文并将其传递给Java层 可能吗 对 如果是,如何进行 将其作为参数传入 我不希望我的用户将参数中的上下文传递给我的库项目,因为我的库项目可能会通过JNI调用,我不知道如何在JNI中获取上下文并将其传递给Java层 然后找出“如何在JNI中获取上下文并将其传递给Java

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

谢谢

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

可能吗

如果是,如何进行

将其作为参数传入

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


然后找出“如何在JNI中获取上下文并将其传递给Java层”。我想象你会像其他物体一样通过它。正如@Blundell所指出的,您实际上没有任何其他选择。

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

/**
 * 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" ...>

并且您的应用程序类位于基本包中

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

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

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

  • android.app.AppGlobals
在源代码中。以及静态函数

  • getInitialApplication

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


    • 我会将其作为参数传递,或者在该库中传递一个单例

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

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

      无论如何都要小心,如中所述,在加载时间和即时运行方面可能存在缺陷,在多进程应用程序上也可能出现崩溃


      HTH

      getApplicationContext()?如果在其他项目中使用库,则库的上下文将是项目的上下文。您想对上下文做什么?@Aracem:我需要库项目中的上下文来执行某些操作,但我不想要求用户在某些参数中显式传递上下文。如何在我的库中独立地获取当前应用程序的上下文?不,我的类不扩展活动,这是一个简单的过程class@Haris如果您的类是普通类,则需要显式地在中传递上下文。:),因此简言之,不可能在android库项目中独立获取应用程序上下文是的,这是可能的,用于扩展应用程序或活动的类。对于任何普通Java类,包括普通Android项目或库项目中的Java类,都不可能单独使用No。您必须将其作为参数传递,正如我们一直说的那样!对不起,但我认为这个答案是另一回事。@Haris Hasan想要的是从库内部访问库外部的类。可能库中的某个方法想要访问继承类的资源或类似的内容。无论如何,你的答案对singleton来说是一个很好的答案:PHe说:“我想在运行时在我的库项目的一个类中获取引用/托管我的库的应用程序的上下文。有可能吗?如果有,怎么做?”这段代码正是这样做的,允许访问正在使用库的应用程序的上下文。我想这是一个解释问题。我有你在我自己的库中发布的相同代码,它解决了这个问题。。。如果可以从库中定义类。我认为哈里斯·哈桑想从图书馆里获取“任何东西”。无论如何,最简单的方法(如果可以接受的话)就是你的答案,@peceps。一般的回答可能意味着反射?很抱歉,打断一下,但应用程序类是否需要在基本包中?强制库用户从类继承
      应用程序
      ,这是一种糟糕的做法-它会产生多重继承的问题,并且需要为库集成创建额外的类。这里最好的方法是使用某种
      init
      方法,该方法将具有
      Context
      paramMate,您现在是我的个人英雄。非常感谢你。我正在为持久性任务制作一个Android库,它应该是完全可重用的,没有任何从项目到库的依赖关系,所以我不能在我的库中创建一个应用程序类,并将其硬编码到清单中,当我想将库移植到其他项目时,这将完全破坏可重用性并导致不兼容性问题。我还计划尽快发布开源版本,这意味着它不能强迫其他人使用library应用程序类。谢谢,访问隐藏类是一件好事。