Класс приложения Android, вызываемый дважды

В моем приложении Android я перегружаю класс Application, и я обновил тег в своем манифесте. Это приложение также создает службу Android. Я поместил несколько журналов в класс onCreate моего приложения, и я вижу, что он вызывается дважды. В первый раз, когда мое приложение запускается (это ожидается), а затем, как правило, сразу после создания службы. журнал также показывает, что создается второй экземпляр приложения. (Я печатаю значение "this", и они разные).

Я думал, что приложение будет создано как одноэлементное. Это происходит, потому что я создаю Сервис?

Ответы

Ответ 1

Да, если вы использовали android: process, то вы запускаете его в отдельном процессе, поэтому, когда служба запускает для него новый процесс, и поэтому необходимо создать новый объект Application для этого процесса.

Но есть более фундаментальная проблема - для объекта приложения просто некорректно запускать одну из своих служб. Важно, чтобы вы не путали приложение с тем, как вы можете думать о "приложении" в другой ОС. Объект Application не управляет приложением. Это приложение является глобальным для приложения в этом процессе. Фактически, объект приложения совершенно лишний - вам никогда не нужно писать приложение для Android. Обычно я рекомендую, чтобы люди не использовали его. Это скорее вызовет проблемы, чем что-либо еще.

Еще один способ выразить это: то, что действительно определяет приложение, - это его коллекция тегов активности, сервиса, получателя и провайдера. Это то, что "запущено". Все приложение - это то, что создано как часть инициализации процесса приложения. Он не имеет собственного жизненного цикла, он просто должен обслуживать другие реальные компоненты в приложении.

Поэтому просто игнорируйте приложение при разработке своего приложения; это уменьшит путаницу. (Вместо этого я предпочитаю использовать глобальные синглетоны для такого состояния.)

Также, как правило, я рекомендую не использовать android: process. Конечно, для этого есть некоторые возможности, но в большинстве случаев это не требуется, и просто делает приложение более оперативным, менее эффективным и сложнее писать (поскольку вы не можете использовать глобальные возможности в одном процессе), Это должно быть очевидно для вас, если вы достигнете места, где на самом деле есть веская причина использовать андроид: процесс.

Ответ 2

Служба не должна действительно восприниматься как активность, и позже вы столкнетесь с проблемами, если подумаете так. Службы и действия могут принадлежать к одному и тому же приложению, если вы определили их таким образом в своем AndroidManifest.xml, но они ведут себя по-разному и имеют разные жизненные циклы. Если вы хотите, чтобы ваша Служба выполнялась в другом процессе, вы устанавливаете android:process="string" в разделе <service>, чтобы присвоить ей имя, отличное от вашего имени приложения. У вас не будет доступа к глобальным переменным, когда он находится в отдельном процессе, и вы должны общаться с вашим сервисом через Intents. Если ваш сервис более сложный, вы можете захотеть сделать его удаленно вызываемым через AIDL. Если вы хотите однопользовательскую активность, установите для этого действия launchMode значение singleInstance или singleTask. singleInstance означает, что это будет первый и единственный экземпляр этого действия в нем, а новые экземпляры не будут созданы для каких-либо новых намерений. Поскольку это единственный экземпляр этого действия, он всегда будет в верхней части стека задач и всегда способен обрабатывать новые намерения, направленные на это действие. Если действие объявлено как singleTask, оно также будет одноточечным, но может иметь другие действия в одном стеке задач и может даже иметь действия в верхней части стека задач над ним. Это важное замечание. Помните об этом: Singleton Действия, которые НЕ в верхней части стека задач не могут обрабатывать новые намерения, а намерение будет удалено. Если вы хотите, чтобы ваша активность всегда могла обрабатывать все новые намерения, предназначенные для нее, вы, скорее всего, захотите использовать singleInstance

Ответ 3

Проблема заключается в том, что Сервис также является компонентом с собственным жизненным циклом, просто у него нет пользовательского интерфейса. Вы должны проверить приложение разработчика фундаментальное для альтернатив.