如何在android中调用getContentResolver?

时间:2011-02-04 06:16:23

标签: android android-context android-contentresolver

我正在编写一个库类来封装我的第一个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是我希望避免在可能的情况下传递ContextContentResolver的方法,因为我希望将其干净地装入黑盒子。

4 个答案:

答案 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和   应用。 通常是第一个   开发人员传递给的人   需要的类和方法   上下文

(强调我的)