Как я могу вызвать 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-приложение, у вас обычно есть два вида контекста, деятельность и Приложение. обычно это первый одно, что застройщик передает классы и методы, которые нужно Контекст
(выделено мной)