在Android库中获取上下文

时间:2014-01-11 23:57:40

标签: java android singleton shared-libraries android-context

我正在编写一个Android应用程序,其中包含一些封装在内部库中的功能。但是,要使此功能起作用,库需要应用程序上下文的实例。给这个上下文库提供库的最佳方法是什么?我看到一些选项,其中没有一个吸引人:

  • 让我的图书馆课程延长Application,并致电getApplicationContext()
    • 通常不鼓励
  • 让我的库类每个都实现单例模式,并且每次调用者在获得对单例的引用时都会传递Context
    • 这要求每个调用者在使用库之前检索应用程序上下文,并且还要求调用者针对库的实例而不是对库类上定义的静态方法进行调用(因此进一步要求保留对此实例的引用。)

3 个答案:

答案 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库并遇到这个主题。