Как я могу вызвать getContentResolver в android?

Я пишу класс библиотеки, чтобы инкапсулировать часть моей логики в моем первом приложении для Android. Одна из функций, которую я хочу инкапсулировать, - это функция, которая запрашивает адресную книгу. Как таковой, ему требуется ContentResolver. Я пытаюсь понять, как сохранить библиотечные функции в черном ящике... то есть, чтобы не пропускать каждый Activity в своем контексте, чтобы получить ContentResolver.

Проблема в том, что я не могу для жизни понять, как получить ContentResolver из моей библиотечной функции. Я не могу найти импорт, содержащий getContentResolver. Googling сказал, чтобы использовать 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, если бы мог, поскольку я надеялся, что он будет чисто черным.

Ответ 1

Пройдите ли каждый вызов функции библиотеки в ContentResolver... или продолжите Application, чтобы сохранить контекст и получить доступ к нему статически.

Ответ 2

Вы можете использовать следующее:

getApplicationContext().getContentResolver() with the proper context.
getActivity().getContentResolver() with the proper context.

Ответ 3

Вот как я это сделал, для тех, кто может найти этот поток в будущем:

Я использовал метод 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;
}

Ответ 4

Немного сложно, не видя больше того, как вы кодируете свою библиотеку, но я не вижу другого варианта использования контекста и поэтому передаю это при вызове этого класса.

В "случайном" классе нет среды для получения contentresolver: вам нужен контекст.

Теперь не слишком странно передавать ваш (активность) контекст вашему классу. Из http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html

В Android контекст используется для многих операций, но в основном для загрузки и доступ к ресурсам. Вот почему все виджеты получают параметр Context в их конструктор. В обычном Приложения для Android, обычно два вида Контекста, Активность и Заявка. Обычно это первый тот, который разработчик передает классов и методов, которые нуждаются в Контекст

(акцент мой)