Почему добавленные представления в WindowManager удаляются при переходе активности только в Nougat?

Я пишу приложение, в котором я добавляю представление к WindowManager, используя следующий код:

private final FloatingBubbleView mBtn;
FloatingBubbleView iv = new FloatingBubbleView(context);
this.mBtn = iv;
this.mWm = (WindowManager) mAppContext.get().getSystemService(Context.WINDOW_SERVICE);
mWm.addView(mBtn, mLp);

конфигурация параметров макета:

final WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
lp.width = iv.getLayoutParams().width;
lp.height = iv.getLayoutParams().height;
lp.type = WindowManager.LayoutParams.TYPE_TOAST;
lp.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
lp.format = PixelFormat.TRANSLUCENT;
lp.gravity = Gravity.TOP | Gravity.LEFT;
lp.x = 0;
lp.y = 100;

Во всех операционных системах до Android 7.0 (Nougat) это представление привязано к WindowManager при переключении действия, и я все еще могу использовать его в следующем открытом действии.

На Nougat по какой-то причине представления удаляются с экрана.

Вопрос: кто-нибудь знает, почему это происходит и как я могу восстановить прежнее поведение, которое у меня было на предыдущих системах? это как-то связано с новым режимом окна произвольной формы, добавленным в Nougat, описанным здесь:

Оконный режим произвольной формы в Android Nougat: что это такое и как разработчики могут его использовать


person Emil Adz    schedule 25.05.2017    source источник


Ответы (1)


Я предполагаю, что проблема в флаге TYPE_TOAST. Я видел эту ошибку с исчезновением представления на Nougat.

Вы можете попробовать использовать флаг TYPE_SYSTEM_ALERT

person shmakova    schedule 25.05.2017
comment
Прежде всего, спасибо за вашу помощь... Я добавлю это, чтобы сделать тест, но я предполагаю, что если бы проблема была в разрешении, я бы не смог добавить представление в WindowManager в первую очередь, что Я могу сделать... проблема в том, что это представление исчезает при переходе активности... я прав? - person Emil Adz; 25.05.2017
comment
@EmilAdz Какие LayoutParams вы используете для FloatingBubbleView? - person shmakova; 25.05.2017
comment
В вопрос добавлена ​​конфигурация параметров макета. - person Emil Adz; 25.05.2017
comment
Хорошо, позвольте мне попробовать это на секунду, но чтобы еще раз прояснить проблему... проблема существует только в последней версии Naugat (7.1.1). предыдущая версия (7.0)... все отлично работает. Не могли бы вы объяснить, что вы имеете в виду: но в последней версии Android все в порядке.? - person Emil Adz; 25.05.2017
comment
После изменения типа на тот, который вы указали, я получаю следующую ошибку: android.view.WindowManager$BadTokenException: невозможно добавить окно android.view.ViewRootImpl$W@e6e33e2 - разрешение отклонено для этого типа окна. Я предполагаю, что это связано с разрешением, которое вы указали ранее? - person Emil Adz; 25.05.2017
comment
@EmilAdz, вам нужно разрешение, как я уже писал ранее. stackoverflow.com/a/39271080/4141049 - person shmakova; 25.05.2017
comment
Ну, во-первых, большое спасибо за вашу помощь. Похоже, это решает мою проблему, и вид прилипает к экрану, когда я меняю экран, но взамен заставляет пользователя пройти через экран разрешений, чтобы позволить ему рисовать над приложениями. Что-то, что не требовалось, когда я использовал TYPE_TOAST. Может быть, есть другой тип, который не требует включения этого разрешения, но все еще работает по назначению? - person Emil Adz; 25.05.2017