weijunfeng
3/29/2019 - 5:06 AM

内存泄漏

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权限