Может ли пользовательский вид знать, что onPause был вызван?

У меня есть пользовательский вид, который запускает операцию Thread, которая периодически помещает вызовы в interwebs. Я хотел бы знать, есть ли у меня способ не убить этот поток из родительского Activity (onPause), чтобы Thread не размахивал в фоновом режиме после того, как Activity была задумана (и / или убита).

Цель здесь заключается в том, чтобы пользовательский вид был самодостаточным и не нуждался в дополнительной обработке из Activity. Способ сделать это будет состоять в том, чтобы прослушивать, когда его родительский фон был создан, и для этого, чтобы позволить бесконечному циклу сна в потоке истекать. Я не вижу способа сделать это, но я надеюсь, что я что-то пропущу.

Если вы не сообщите об этом напрямую.

Для вашей цели переопределите View.onDetachedFromWindow() и View.onDetachedFromWindow() свой View.onDetachedFromWindow() там. Затем, когда вид снова будет виден, закрутите Thread обратно в View.onAttachedToWindow() . Проблема с onPause () и onResume () заключается в том, что у вас все еще может быть вид, видимый на экране, но прикрепленный к приостановленному действию. Примером того, когда это может произойти, является то, что у вас есть одно действие в окне, которое накладывает другое.

Или, как предполагает william gouvea, фрагмент может быть лучше подходит для вашей цели, поскольку у него уже есть крючки жизненного цикла для паузы и возобновления, и все, что говорит с сетью, действительно попадает в сферу управления в любом случае.

Да, вы можете использовать код ниже,

 @Override protected void onVisibilityChanged(@NonNull View changedView, int visibility) { super.onVisibilityChanged(changedView, visibility); if (visibility == View.VISIBLE) //onResume called else // onPause() called } @Override public void onWindowFocusChanged(boolean hasWindowFocus) { super.onWindowFocusChanged(hasWindowFocus); if (hasWindowFocus) //onresume() called else // onPause() called } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); // onDestroy() called } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); // onCreate() called } 

Либо вы должны сообщить своему представлению, что собственная деятельность больше не находится на переднем плане, либо опросить систему каким-то методом запроса о том, какая задача находится на переднем плане, что кажется крайне неэффективным.

Вот две ссылки, которые затронули эту проблему:

  • Как проверить активность на переднем плане или на видимом фоне?
  • Проверка, работает ли приложение Android в фоновом режиме

(Это может быть не совсем ответ, но он слишком велик для комментария)

Если вы просто переопределяете класс View и создаете свой собственный CustomView, вы можете создать интерфейс для работы в качестве слушателя, который должен быть реализован родительской активностью, поэтому, когда что-то происходит, вы запускаете событие и устанавливаете связь между этими компонентами взад и вперед ,

В зависимости от того, что вы хотите достичь, Фрагменты могут быть полезны, поскольку этот компонент имеет свой жизненный цикл, подобный активности (например, onPause / onResume), содержит ваше собственное состояние, имеющее или не имеющее представление, и может сохранять свое состояние между конфигурационными часами.

См. Больше в: http://developer.android.com/reference/android/app/Fragment.html http://developer.android.com/guide/components/fragments.html