Ответ 1
В моей службе я добавляю представление WindowManager с помощью addView(). Когда я готов скрыть представление, я вызываю removeView() с помощью ссылки View. Это отлично работает - большую часть времени. У меня есть случайные отчеты Force Close, которые говорят, что 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) {}
Является ли View автоматически удаленным из WindowManager, если моя служба остановлена (убита)?
По моему опыту, они удаляются, когда служба убита. Вы можете проверить это, остановив свое обслуживание, не удаляя представления. Не знаю, почему это работает.
Меня беспокоит то, что моя вторая ссылка на WM отличается, когда я иду, чтобы удалить представление. Если это так, mView все еще отображается, когда я поймаю исключение? Я бы попытался сохранить ссылку на WM при добавлении представления, но у меня были проблемы, когда ссылки на System Services со временем ухудшались.
Сообщите мне, если вы когда-нибудь решите эту проблему.