我正在编写一个Android应用程序,其中包含一些封装在内部库中的功能。但是,要使此功能起作用,库需要应用程序上下文的实例。给这个上下文库提供库的最佳方法是什么?我看到一些选项,其中没有一个吸引人:
Application
,并致电getApplicationContext()
Context
。
答案 0 :(得分:10)
这个上下文给图书馆的最佳方法是什么?
将Context
传递到您的库中需要Context
的公开方法。这就是Android SDK所做的事情。
或者,更改库以公开对象,而不是静态方法,并让对象包含Context
的实例(提供给创建实例的构造函数或工厂方法)。
让我的库类扩展Application,并调用getApplicationContext()
如果您可以在getApplicationContext()
上致电Context
,那么您就可以这样做,而无需继承Application
。
答案 1 :(得分:4)
这是我发现的一个解决方案,我没有测试过,但 Firebase 显然使用它来避免创建init方法:
“应用程序启动时会发生什么,它会在系统中注册所有ContentProviders(调用onCreate)。这意味着此时尚未启动任何活动,但我们可以访问(应用程序)上下文,我们可以使用此上下文“
初始化我们的库
基本上,您正在使用空ContentProvider的onCreate作为init。这很黑,但无缝。
https://medium.com/@andretietz/auto-initialize-your-android-library-2349daf06920
答案 2 :(得分:0)
我不确定此案例的最佳做法,但我想在Application onCreate期间在我的单例类中设置Context。
MyLibrary.init(this);
为什么呢? 如果你之前使用过Crashlytic / Fabric,你会发现他们正在使用
Fabric.with(this, new Crashlytics());
如果您阅读Fabric中的代码,则会发现它们将Context存储在Fabric单例中。
Facebook Android SDK做了类似的事情:
FacebookSdk.sdkInitialize(getApplicationContext());
如果您浏览他们的代码会发现他们存储静态上下文。
那么,哪些是最佳做法?我不确定,但我相信这些是很棒的开发人员创建了很棒的库,他们在出来之前对这个问题进行了辩论。无论如何,我还在学习如何编写最好的android库并遇到这个主题。