Как создать намерение из класса "расширяет приложение", контекст равен нулю
У меня есть класс, который расширяется android.app.Application
, который я использую, чтобы сохранить глобальное состояние вокруг моего приложения.
Я хочу запустить сервис, когда мое приложение запускается, поэтому внутри конструктора этого GlobalState
класс я пытаюсь создать намерение и запустить службу, но не могу создать намерение, потому что не могу достать Context
public GlobalState() {
Log.d(this.getClass().getSimpleName(), "Initialise DatabaseManager");
dbManager = new DatabaseManager(this);
Log.d(this.getClass().getSimpleName(), "Requesting start up of ContactsUpdater Service");
Intent i = new Intent(this, ContactsUpdater.class);
startService(i);
}
Я пытался использовать getApplicationContext()
, но это вызывает исключение нулевого указателя.
java.lang.NullPointerException в android.content.ContextWrapper.getPackageName(ContextWrapper.java:120) в android.content.ComponentName.(ComponentName.java:75) в android.content.Intent.(Intent.java:2551) в com.jameselsey.apps.cercademi.domain.GlobalState.(GlobalState.java:48) в java.lang.Class.newInstanceImpl(собственный метод) в java.lang.Class.newInstance(Class.java:1479) в android.app.Instrumentation.newApplication(Instrumentation.java:957) в android.app.Instrumentation.newApplication(Instrumentation.java:942) в android.app.ActivityThread$PackageInfo.makeApplication(ActivityThread.java:518)
Я в замешательстве, я могу создать DatabaseManager
хорошо, используя это..
Есть идеи?
3 ответа
Для Activity, Service, ContentProvider и Application не следует ничего делать в конструкторе. Первое место, где вы должны работать, когда вы знаете, что объект инициализирован и готов к использованию, - это onCreate().
Кроме того, подумайте еще раз о том, что "я хочу запустить службу при запуске приложения". То, что вы делаете здесь, - это попытка запустить службу, когда ваш процесс запускается. Я действительно не думаю, что ты этого хочешь. Вы хотите, чтобы эта служба запускалась, потому что вы случайно получили передачу в фоновом режиме?
Если вы просто хотите выполнить инициализацию в первый раз, я рекомендую вообще не использовать Application. Имейте синглтон, который можно получить, когда это необходимо. Тогда ваша инициализация происходит в тот момент, когда она действительно необходима. Нет необходимости связывать это со службой; Вы можете просто сделать нить. Единственная причина использования Сервиса - сообщить системе "мое приложение занято фоновой работой, о которой заботится пользователь, пожалуйста, постарайтесь не убить меня".
Базовый класс для тех, кому необходимо поддерживать глобальное состояние приложения. Вы можете предоставить свою собственную реализацию, указав ее имя в теге
вашего AndroidManifest.xml, что приведет к созданию экземпляра этого класса для вас при создании процесса для вашего приложения / пакета.
Источник: http://developer.android.com/reference/android/app/Application.html
В четырех случаях из десяти проблема закрытия приложений разработчиков Android заключается в том, что они забывают изменить манифест Android. (Я полностью составил эту статистику).
Application
продолжается Context
так что вы должны быть в состоянии пройти его.
Однако расширение Application - не самый экономически эффективный способ сделать это. Чтобы объяснить это более кратко, вот еще одна цитата из той же страницы:
Обычно нет необходимости создавать подкласс Application. В большинстве случаев статические синглтоны могут предоставлять ту же функциональность более модульным способом. Если вашему синглтону нужен глобальный контекст (например, для регистрации широковещательных приемников), функции для его получения может быть задан контекст, который внутренне использует Context.getApplicationContext() при первом создании синглтона.