我想获得在我的库项目的一个类中运行时引用/托管我的库的应用程序的上下文。可能吗?如果是,怎么样?
由于
更新 我不希望我的用户将参数中的上下文传递给我的库项目,因为我的库项目可能会通过JNI调用,我不知道如何在JNI中获取上下文并将其传递给Java层。
答案 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。 我发现有一个名为:
的类在源代码中。和静态函数
<强> getInitialApplication 强>
可以返回Application
个对象。但它必须在主线程中调用,并且该类是隐藏的。
无论如何,你可以通过反映在java中使用它。您可以使用FindClass()
和FindStaticObjectMethod()
找出方法并使用它。
希望有所帮助。
答案 3 :(得分:0)
在您的库项目中,为主项目添加依赖项。在IntelliJ中,当您尝试引用此全局变量时,它将为您执行此操作。在Eclipse中我不确定......
答案 4 :(得分:0)
我会将其作为参数传递或将其传递给该库中的单例。
让主应用程序应用程序扩展库的应用程序类是一个坏主意,因为在Java中你只能从类扩展一次。如果您的申请需要转到另一个图书馆,您将遇到麻烦。
答案 5 :(得分:0)
根据this post,您可以借助ContentProvider
让库使用应用程序上下文自动初始化。
无论如何,要小心,如post comments中所述,在加载时间和即时运行以及多进程应用程序崩溃方面可能存在缺陷。
HTH