WindowManager在addView时会创建ViewRootImpl对象, ViewRoorImpl在创建时会向系统服务AccessibilityManager中注册监听, 并在WindowManager移除该view时,
ViewRootImpl从AccessobilityMananger中移除监听, 但是在移除前有mAdded=true的判断, 如果WindowManager在addView时抛出异常,
则会导致ViewRootImpl无法从AccessobilityMananger中移除监听, 最终导致系统服务AccessibilityManager的监听中一直有创建ViewRootImpl的上下文的引用
在项目中AMConnectionManager中 case WHAT_SHOW_WAITING_DIALOG中创建显示HXProgressDialog可能会抛出异常, 符合上面分析的情况
在LandscapeActivity中forceRefresh()中使用了TYPE_SYSTEM_ALERT的权限, 这个权限是系统权限,应用无法使用, 导致后面的addView抛出异常, 符合上面分析
这个两个地方会导致LandscapeActivity在destroy后, 仍然被系统服务AccessobilityMananger引用, 无法被回收, 导致内存泄漏
解决:
1. AMConnectionManager中 case WHAT_SHOW_WAITING_DIALOG中创建显示HXProgressDialog, 先判断activity的token不为null
2. LandscapeActivity中forceRefresh()中使用了TYPE_SYSTEM_ALERT的权限, 先判断应用是否有TYPE_SYSTEM_ALERT权限