2013-02-12 2 views
2

Задача: я должен отслеживать видимость всего приложения Android и генерировать события, когда он переходит на задний план или на передний план. Первая часть задачи завершена: у меня есть специальный глобальный счетчик, который я увеличиваю в Activity onStart() и декремент в действии onStop(), когда этот счетчик падает до нуля, тогда мое приложение перешло на задний план.Как отслеживать активность visibilty с учетом диалогов и системных окон?

Вторая часть задачи - обман. Я знаю около strange behavior of onResume() и совет по использованию onWindowFocusChanged (boolean). Я посмотрел в документации onWindowFocusChanged (булевой) и заметил такую ​​вещь:

Как правило, однако, возобновилась деятельность будет иметь окно фокус ... если он не отображается другой диалоги или всплывающие окна которые принимают фокус ввода , и в этом случае сама деятельность не будет иметь фокуса , когда у него есть другие окна. Аналогично, система может отображать окна системного уровня (например, панель уведомлений панели состояния или системное предупреждение ), которое временно примет фокус ввода окна без , приостанавливая работу переднего плана.

Есть ли способ проверить: чье окно отображается над возобновленной деятельностью из моего приложения? Это мой диалог или keyguard? Есть ли способ поймать событие: все, кроме моих окон над возобновленными действиями, удаляются?

ответ

0

Ваш подход, основанный на использовании счетчика, является неправильным. Одна из причин: onStop() не гарантирует выполнение.

Я бы предположил, что ваше понятие «фон» и «передний план» должно быть таким же, как у Android. Однако, когда я читал, что вы сделали до сих пор, кажется, что у вас есть другое представление о том, что означает «фон» и «передний план», чем у Android.

Оттуда:

  • Если у вас есть представление о том, что означают фон и передний план, который отличается от Android, вы не делаете себе пользу и, вероятно, следовать за порочный путем, так recosnider регулируя значение переднего плана и фона.
  • После того, как у вас есть идея Android об фоновом режиме и переднем плане, вопрос в том, почему вы должны генерировать события, когда Android уже делает это. Если вам нужно отправить события на услугу или подобное, то это будет просто, прослушивая Activity lifecycle events и активируя соответствующие события для вашего Сервиса.

Относительно onWindowFocusChanged: Да, конечно, панель уведомлений может временно скрыть ваше приложение; вы еще не использовали Android-устройство? Большой вопрос здесь в том, будете ли вы рассматривать свое приложение в фоновом режиме, потому что Android считает ваше приложение в фоновом режиме, если отображается панель уведомлений.

Обновление: я просто перечитываю название вашего Q. К сожалению, вы не заявляете, что вам действительно нужно/нужно делать, потому что видимость может означать много чего. Например. вы считаете, что ваше приложение должно быть видимым, если над ним выложена полупрозрачная панель уведомлений или нет? Но нижняя строка остается прежней: было бы проще, если вы выровняете то, что хотите, с тем, что предлагает Android.;)

Обновление 2: Если вам действительно нужно знать, была ли ваша активность перемещена на задний план с помощью всплывающего окна вашей собственной деятельности или самостоятельно, this answer here должен предоставить вам необходимую информацию.

+0

Техническое задание копируется с iOS. В приложении iOS вы можете легко отслеживать глобальную видимость всего приложения. В Android у приложения нет событий, «приложение действительно вводило фон/передний план», поэтому я должен имитировать их. Приложение действительно вводило фон, когда ни одна из приложений не находится в видимом состоянии (http://developer.android.com/reference/android/app/Activity.html). Приложение было введено на переднем плане, когда оно было в фоновом режиме, и затем любая активность переходит в видимое состояние. – QuickNick

+0

Я не могу представить, почему это проблема для вас. Почему вы не можете жить с собственным понятием вашего Android-сообщества, когда на переднем плане или в фоновом режиме происходит действие? –

+0

Это техническая задача: я должен отчитываться о событиях отслеживания аналитики. «Приложение действительно появилось на переднем плане/фоне». В моем вопросе я объяснил, почему я не могу использовать только onStart()/onResume()/onPause()/onStop(). – QuickNick