Отслеживание вида, добавленного в WindowManager (без функции findViewById ()?)

в моем сервисе я добавляю вид на WindowManager с addView(). Когда я буду готов скрыть вид, я позову removeView() С помощью View ссылка. Это прекрасно работает большую часть времени.

у меня есть случайные силовые близкие отчеты, которые говорят, что вид не прикреплен к WindowManager. В этом есть смысл. Проблема в том, что я думаю, что сервис убивается Android, и когда пришло время скрыть представление, он пытается removeView на неправильном View.

я попытался проверить на вид, чтобы быть null, но, видимо, не в этот момент, он просто не подключен к WindowManager. Кажется, что если ссылка на представление потеряна, нет никакого способа получить доступ к ней снова.

как я могу получить эквивалент findViewById() на ? Это View автоматически удаляются из WindowManager Если моя служба остановлена (убил)? Есть ли способ сохранить ссылку на View Так что если служба остановлена, я еще могу удалить the View позже (я также пытаюсь избежать утечки View)?

4 ответов


в моем сервисе я добавляю представление в WindowManager с помощью addView (). Когда я готов скрыть представление, я вызываю removeView (), используя ссылку на представление. Это прекрасно работает большую часть времени. У меня есть случайные отчеты о принудительном закрытии, которые говорят, что представление не прикреплено к WindowManager.

у меня такая же проблема. Надеюсь, эксперт вмешается.

как я могу получить эквивалент findViewById() в WindowManager себя?

Сохраните ссылку на добавленное представление и просто используйте removeView(mView).

В настоящее время в моей службе, чтобы добавить представление:

WindowManager.LayoutParams params = ...
mView = new View(this);
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.addView(mView, params);

затем, чтобы удалить вид, я избегаю случайных FC, поймав исключение:

WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
try {
    wm.removeView(mView);
} catch (Exception e) {}

вид автоматически удаляется из WindowManager, если моя служба остановлена (убита)?

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

меня беспокоит то, что моя вторая ссылка на WM отличается, когда я иду, чтобы удалить представление. Если это так, отображается ли mView, когда я ловлю исключение? Я бы попытался сохранить ссылку на WM при добавлении представления, но у меня были проблемы, когда ссылки на Системные службы, похоже, идут плохо с течением времени.

Дайте мне знать, если вы когда-нибудь решил эту проблема.


чтобы проверить, был ли view успешно подключен к Windows Manager или все еще подключен, вы можете использовать view.isShown();.


проверьте, что родительские представления != null перед попыткой удалить его.

if(mView.getParent() != null){
   wm.removeView(mView);
}

вы также можете использовать:

ViewCompat.isAttachedToWindow(mView);

по документам:

возвращает true, если предоставленное представление в данный момент подключено к окну.