背景
公司项目增加了个远程控制的模块,全套流程已经实现了,但是发现在客户端网络不稳定的情况下因为安卓的动画原因会出现动画帧卡顿在屏幕上留下残影的问题,体验不是很好,想到了关闭动画减少画面传输优化这一过程
废话少说直接上代码
/*
* 反射IWindowManager实现控制系统动画开关
* 参考安卓开发者选项源码:packages/apps/Settings/src/com/android/settings/DevelopmentSettings.java
* */
public static void hidenSystemAnim(boolean isClose) {
try {
Method getServiceMethod = Class.forName("android.os.ServiceManager").getDeclaredMethod("getService", new Class[]{String.class});
Object ServiceManager = getServiceMethod.invoke(null, new Object[]{"window"});
Class<?> cStub = Class.forName("android.view.IWindowManager$Stub");
Method asInterface = cStub.getMethod("asInterface", IBinder.class);
Object IWindowManager = asInterface.invoke(null, ServiceManager);
//开关窗口动画
IWindowManager.getClass().getDeclaredMethod("setAnimationScale",new Class[]{int.class,float.class})
.invoke(IWindowManager,new Object[]{0,isClose?0f:1f});
//开关过渡动画
IWindowManager.getClass().getDeclaredMethod("setAnimationScale",new Class[]{int.class,float.class})
.invoke(IWindowManager,new Object[]{1,isClose?0f:1f});
} catch (Exception e) {
e.printStackTrace();
}
}
分析
1.通过阅读:packages/apps/Settings/src/com/android/settings/DevelopmentSettings.java,打开会看到好多静态变量,
2.其中WINDOW_ANIMATION_SCALE_KEY,TRANSITION_ANIMATION_SCALE_KEY,为控制窗口动画缩放,过渡动画缩放的键
3.继续根据键值追查下去,可以发现在onCreate中键值被添加到了ListPreference并返回给了mWindowAnimationScale
4.跟踪mWindowAnimationScale,最终在onPreferenceChange中发现参数传递给了writeAnimationScaleOption方法,根据不同的Preference类型判断更改的对象
5.writeAnimationScaleOption方法,我们主要看1,3参数,根据witch来确定需要更改设置的类型,根据newValue来设置新的参数值
6.方法中调用了mWindowManager.setAnimationScale(which, scale);来设置新的参数值 mWindowManager 为AIDL对象,看看他的初始化过程,初始化过程的IWindowManager ServiceManager都是隐藏对象,使用反射机制获取即可
总结
1.小弟的第一篇博客,写的可能有点屎,望大家海涵……
2.以上过程为备用总结,如有不正还请谅解并指出,感谢。