我正在编写一个库类来封装我的第一个Android应用程序中的一些逻辑。我要封装的功能之一是查询地址簿的函数。因此,它需要ContentResolver
。我试图弄清楚如何将库函数保持为黑盒子......也就是说,避免让每个Activity
在其自己的上下文中传递以获得ContentResolver
。
问题是我不能为我的生活弄清楚如何从我的库函数中获取ContentResolver
。我找不到包含getContentResolver
的导入。谷歌搜索说使用getContext
获取Context
来调用getContentResolver
,但我找不到包含getContext
的导入。下一篇文章说使用getSystemService
来获取一个对象来调用getContext
。但是 - 我找不到包含getSystemService
的任何导入!
所以我很困惑,我怎么能在封装的库函数中获得ContentResolver,或者我几乎不会在每次调用Activity
时传递对它自己的上下文的引用?
我的代码基本上是这样的:
public final class MyLibrary {
private MyLibrary() { }
// take MyGroupItem as a class representing a projection
// containing information from the address book groups
public static ArrayList<MyGroupItem> getGroups() {
// do work here that would access the contacts
// thus requiring the ContentResolver
}
}
getGroups是我希望避免在可能的情况下传递Context
或ContentResolver
的方法,因为我希望将其干净地装入黑盒子。
答案 0 :(得分:9)
您可以这样使用:
getApplicationContext().getContentResolver() with the proper context.
getActivity().getContentResolver() with the proper context.
答案 1 :(得分:7)
让每个库函数调用都传递到ContentResolver
...或者扩展Application
以保持上下文并静态访问它。
答案 2 :(得分:5)
对于任何可能在未来找到这个主题的人来说,这就是我如何做到这一点:
我使用了sugarynugs创建类extends Application
的方法,然后在应用程序清单文件中添加了相应的注册。我的应用程序类的代码是:
import android.app.Application;
import android.content.ContentResolver;
import android.content.Context;
public class CoreLib extends Application {
private static CoreLib me;
public CoreLib() {
me = this;
}
public static Context Context() {
return me;
}
public static ContentResolver ContentResolver() {
return me.getContentResolver();
}
}
然后,为了在我的库类中获取ContentResolver,我的功能代码如下:
public static ArrayList<Group> getGroups(){
ArrayList<Group> rv = new ArrayList<Group>();
ContentResolver cr = CoreLib.ContentResolver();
Cursor c = cr.query(
Groups.CONTENT_SUMMARY_URI,
myProjection,
null,
null,
Groups.TITLE + " ASC"
);
while(c.moveToNext()) {
rv.add(new Group(
c.getInt(0),
c.getString(1),
c.getInt(2),
c.getInt(3),
c.getInt(4))
);
}
return rv;
}
答案 3 :(得分:2)
有点难,没有看到你如何编写你的库,但我没有看到另一个选项然后使用上下文,所以在调用该类时传递它。
“随机”类没有获取内容解析器的环境:您需要一个上下文。
现在将您的(活动)上下文传递给您的课程并不太奇怪。来自http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html
在Android上,Context用于许多操作,但主要用于加载和 访问资源。这就是为什么所有的 窗口小部件接收Context参数 他们的构造函数。在常规 Android应用程序,你通常有 两种Context,Activity和 应用。 通常是第一个 开发人员传递给的人 需要的类和方法 上下文强>
(强调我的)