Может ли пользовательский вид знать, что onPause был вызван?
У меня есть пользовательский вид, который запускает операцию Thread, которая периодически помещает вызовы в interwebs. Я хотел бы знать, есть ли у меня способ не убить этот поток из родительского Activity (onPause), чтобы Thread не размахивал в фоновом режиме после того, как Activity была задумана (и/или убита).
Цель состоит в том, чтобы пользовательский вид был самодостаточным и не нуждался в дополнительной обработке из Activity. Способ сделать это будет состоять в том, чтобы прослушивать, когда его родительский фон был зашифрован, и для этого, чтобы затем разрешить бесконечный цикл сна в потоке. Я не вижу способа сделать это, но надеюсь, что я что-то пропустил.
Ответы
Ответ 1
Нет, если вы не сообщите об этом напрямую.
Для вашей цели переопределите View.onDetachedFromWindow()
и отпустите свой поток там. Затем, когда вид снова виден, закрутите нить назад в View.onAttachedToWindow()
. Проблема с onPause() и onResume() заключается в том, что у вас все еще может быть вид, видимый на экране, но прикрепленный к приостановленному действию. Пример того, когда это может произойти, - это если у вас есть одно действие в окне, которое накладывает другое.
Или, как предполагает william gouvea, фрагмент может быть лучше подходит для вашей цели, поскольку у него уже есть крючки жизненного цикла для паузы и возобновления, и все, что говорит с сетью, действительно все равно попадает в область контроллера.
Ответ 2
Да, вы можете использовать код ниже,
@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
}
Ответ 3
Если вы просто переопределяете класс View и создаете свой собственный CustomView, вы можете создать интерфейс для работы в качестве слушателя, который должен быть реализован родительской активностью, поэтому, когда что-то происходит, вы запускаете событие и устанавливаете связь между этими компонентами назад и вперед.
В зависимости от того, что вы хотите достичь, фрагменты могут быть полезны, поскольку этот компонент имеет свой жизненный цикл, подобный активности (например, onPause/onResume), содержит ваше собственное состояние, имеет или не имеет вид и может сохранять свое состояние между конфигурации.
См. больше в:
http://developer.android.com/reference/android/app/Fragment.html
http://developer.android.com/guide/components/fragments.html
Ответ 4
Либо вы должны сообщить своему представлению, что собственная деятельность больше не находится на переднем плане, либо опросить систему каким-то методом запроса о том, какая задача находится на переднем плане, что кажется крайне неэффективным.
Вот две ссылки, которые затронули эту проблему:
(Это может быть не совсем ответ, но он слишком велик для комментария)