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

Har*_*san 59 android android-context android-library

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

谢谢

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

pec*_*eps 53

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

/**
 * 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;
  }

}
Run Code Online (Sandbox Code Playgroud)

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

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

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

}
Run Code Online (Sandbox Code Playgroud)

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

<application android:name="App" ...>
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 他说:"我希望获得在我的库项目的一个类中运行时引用/托管我的库的应用程序的上下文.是否可能?如果是,如何?" 此代码正是如此,可以访问使用该库的应用程序的上下文. (7认同)
  • 嗨!对不起,但我认为这个答案有不同之处.@ Haris-Hasan想要的是从图书馆内部访问图书馆外的课程.也许库中的方法想要访问继承类的资源或类似的东西.无论如何,你的答案对于单身人士来说是一个很好的答案:P (3认同)

Com*_*are 12

可能吗?

是.

如果有,怎么样?

将其作为参数传递.

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

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

  • :)所以简而言之,在Android库项目中无法独立获取应用程序上下文 (3认同)
  • 是的,对于扩展应用程序或活动的类,它是可能的.对于任何普通的Java类*,包括*普通Android项目或库项目中的那些,都不可能独立.你必须将它作为参数传递,正如我们一直说的那样 (2认同)

小智 9

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

  • android.app.AppGlobals

在源代码中.和静态功能

  • getInitialApplication

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