Ответ 1
Вы можете исправить это, используя флаг FLAG_ACTIVITY_NEW_TASK
:
Intent intent = new Intent(this, ApplicationActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
Это потому, что вам нужно запустить новую задачу, когда Activity запускается вне контекста Activity. Но я настоятельно рекомендую не запускать Activity из вашего приложения onCreate()
.
Android имеет 4 компонента: активность, сервис, контент-провайдер и трансляция.
Когда Android должен активировать один из этих компонентов из вашего приложения, он смотрит, есть ли уже существующий процесс работы с вашим приложением. Если нет, то Android запускает новый процесс, инициализирует его, а затем инициализирует ваш собственный экземпляр приложения. И затем он активирует один из необходимых компонентов.
Теперь рассмотрим следующий сценарий: ваше приложение объявило контент-провайдера в AndroidManifest.xml
, а Android как раз запустит ваше приложение, чтобы вы могли предоставить некоторые данные другому приложению переднего плана.
- Отправляется запрос поставщика контента
- Ваше приложение не было запущено, и Android начинает новый процесс для него.
- Создан собственный экземпляр приложения. Вызывается
-
Application.onCreate()
. - Вы начинаете действие
- Ваш контент-провайдер получает запрос
Кто-то просто хотел подключиться к вашему провайдеру контента, но вместо этого ваше приложение начало работу. То же самое верно для запуска фоновой службы, а иногда и для широковещательных приемников.
А также подумайте, нужно ли какой-либо другой активности приложения A начать действие X из вашего приложения. Но в onCreate()
вы начали активность Y, а затем X также запускается Android. Затем пользователь нажимает назад. Что должно произойти? Его сложно...
Начальные действия от Application
onCreate
могут привести к довольно странному опыту пользователя. Так что не делайте этого.
UPDATE: Поскольку Android гарантирует, что приложение будет создано только один раз и до любого другого компонента, вы можете использовать следующий код для доступа к отдельному экземпляру приложения:
public class MyApplication extends Application
{
private static MyApplication s_instance;
public MyApplication()
{
s_instance = this;
}
public static MyApplication getApplication()
{
return s_instance;
}
}