Window添加悬浮窗解析
- WindowManager获取:
window作为一种视图抽象承载者,唯一的实现类是PhoneWindow,PhoneWindow中包含一个视图结构DecorView(FrameLayout 包含Title布局) 该View便是我们会addView时的视图根布局 包含结构如下图:
添加Window时代码如下:
WindowManager windowManager = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);
WindowManager windowManager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
上图中第一种获取的WindowManager是当前Activity窗口管理类WindowManagerImp,这个窗口管理实现类会有多个每个Activirty都会包含一个该实例,Activity销毁 该窗口管理器包含的视图也将销毁 。第二种是通过获取全局应用级别的WindowManagerImpl实现类 ,该窗口管理器包含的窗口个和Application的生命一样长
下面是Activty获取WindowManager的实现:
Activity.class
@Override
public Object getSystemService(@ServiceName @NonNull String name) {
if (getBaseContext() == null) {
throw new IllegalStateException(
"System services not available to Activities before onCreate()");
}
if (WINDOW_SERVICE.equals(name)) {
return mWindowManager; // 返回当前Acticvty的成员变量mWindowManager
} else if (SEARCH_SERVICE.equals(name)) {
ensureSearchManager