以前研究Window和WindowManager的工作机制时会出现找不到IWindowManager和IWindowSession还有IWindow这个几个类,后来发现在SDKplatforms/android-16/sources/java/android/view下面有几个aidl文件,但是高版本的都找不到,被隐藏掉了,研究源码的话可以参照这几个aidl文件,但是Android确实隐藏了一些类,至于为什么这得问API的设计人员了。
了解Java反射机制的撸涩这里应该明白怎么使用这些隐藏的类,既然知道类名和里面的接口,不多说了,例如在模拟按键处理时用到了:
IBinder wmbinder = ServiceManager.getService( "window" );
final IWindowManager wm = IWindowManager.Stub.asInterface( wmbinder );
需要引入的类是:
import android.os.ServiceManager;
import android.view.IWindowManager;
尴尬了,没有类可以让你导入,怎么办,重写呗,引入低版本的aidl文件到你的工程中,替换里面的实现方法,处理错误后生成自己的ServiceManager和IWindowManager
try{
Object object = new Object();
Method getService = Class.forName("android.os.ServiceManager").getMethod("getService", String.class);
Object obj = getService.invoke(object, new Object[]{new String("window")});
//System.out.println(obj.toString());
windowMger = IWindowManager.Stub.asInterface((IBinder)obj);
}catch(ClassNotFoundException ex){
//ignored
}catch(NoSuchMethodException ex){
//ignored
}catch(IllegalAccessException ex){
//ignored
}catch(InvocationTargetException ex){
//ignored
}
本文转自http://edu.gamfe.com/tutor/d/37656.html