Как создать намерение из класса «расширяет приложение», контекст равен нулю - PullRequest
2 голосов
/ 26 июня 2011

У меня есть класс, который расширяет 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 ]

3 голосов
/ 26 июня 2011

Для Activity, Service, ContentProvider и Application не следует ничего делать в конструкторе. Первое место, где вы должны работать, когда вы знаете, что объект инициализирован и готов к использованию, это onCreate ().

Далее, пожалуйста, подумайте еще раз: «Я хочу запустить службу при запуске приложения». То, что вы здесь делаете, пытается запустить сервис, когда ваш процесс запускается. Я действительно не думаю, что ты этого хочешь. Вы хотите, чтобы эта служба была запущена, потому что вы получили трансляцию в фоновом режиме?

Если вы просто хотите выполнить инициализацию в первый раз, я рекомендую вообще не использовать Application. Имейте синглтон, который можно получить, когда это необходимо. Тогда ваша инициализация происходит в тот момент, когда она действительно необходима. Нет необходимости связывать это со службой; Вы можете просто сделать нить. Единственная причина использования Сервиса - сообщить системе «мое приложение занято фоновой работой, о которой заботится пользователь, пожалуйста, постарайтесь не убивать меня».

1 голос
/ 26 июня 2011

Базовый класс для тех, кому необходимо поддерживать глобальное состояние приложения. Вы можете предоставить свой собственный реализации, указав его имя в вашем AndroidManifest.xml тег , который приведет к тому, что этот класс будет создан для вас, когда процесс для вашего приложение / пакет создан.

Источник: http://developer.android.com/reference/android/app/Application.html

В четырех случаях из десяти проблема принудительного закрытия Android-разработчиком - забыть изменить манифест Android. (Я полностью составил эту статистику).

Application расширяет Context, так что вы должны быть в состоянии пройти его.

Однако расширение Application - не самый экономически эффективный способ сделать это. Чтобы объяснить это более кратко, вот еще одна цитата с той же страницы:

Обычно нет необходимости создавать подкласс Application. В большинстве случаев статические синглтоны могут предоставлять ту же функциональность более модульным способом. Если вашему синглтону необходим глобальный контекст (например, для регистрации широковещательных приемников), функции для его получения может быть задан контекст, который внутренне использует Context.getApplicationContext () при первом создании синглтона.

0 голосов
/ 26 июня 2011

В onCreate(), обязательно позвоните super.onCreate().

...