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

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

проблема в том, что я не могу для жизни меня выяснить, как получить ContentResolver из моей библиотеки функция. Я не могу найти импорт, который содержит getContentResolver. Googling сказал использовать getContext и Context по которому звонить getContentResolver, но я не могу найти импорт, содержащей getContext либо. Следующие сообщения сказали использовать getSystemService чтобы получить объект для вызова getContext. Но - я не могу найти импорт, содержащий getSystemService либо!

поэтому я застрял, задаваясь вопросом, как я могу получить ContentResolver в инкапсулированной библиотечной функции, или я в значительной степени застрял с каждым вызовом Activity pass в a ссылка на собственный контекст?

мой код в основном выглядит так:

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 если бы я мог, так как я надеялся, что он будет чисто черный ящик.

4 ответов


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


вы можете использовать такой:

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

вот как я закончил это делать, для любого, кто может найти эту нить в будущем:

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

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

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

теперь это не слишком странно, чтобы на самом деле передать ваш (activity) контекст вашему классу. От http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html

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

(выделено мной)