Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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

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

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

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