Ответ 1
Пройдите ли каждый вызов функции библиотеки в ContentResolver
... или продолжите Application
, чтобы сохранить контекст и получить доступ к нему статически.
Я пишу класс библиотеки, чтобы инкапсулировать часть моей логики в моем первом приложении для 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
, если бы мог, поскольку я надеялся, что он будет чисто черным.
Пройдите ли каждый вызов функции библиотеки в 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: вам нужен контекст.
Теперь не слишком странно передавать ваш (активность) контекст вашему классу. Из http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html
В Android контекст используется для многих операций, но в основном для загрузки и доступ к ресурсам. Вот почему все виджеты получают параметр Context в их конструктор. В обычном Приложения для Android, обычно два вида Контекста, Активность и Заявка. Обычно это первый тот, который разработчик передает классов и методов, которые нуждаются в Контекст
(акцент мой)