В моем сервисе я добавляю представление в WindowManager с помощью addView ().Когда я готов скрыть представление, я вызываю removeView (), используя ссылку View.Это прекрасно работает - большую часть времени.Я иногда получаю отчеты о принудительном закрытии, в которых говорится, что представление не присоединено к 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, когда добавляю представление, но у меня были проблемы, когда ссылки на системные службы со временем кажутся плохими.
Дайте мне знать, если вы когда-нибудь решали эту проблему.