在Android操作系统中,我使用反射来获取IWindowManager
:
Class tempClass = Class.forName("android.os.ServiceManager");
Method method = tempClass.getMethod("getService", String.class);
IBinder binder = (IBinder) method.invoke(null,new Object[] { "window" });
IWindowManager mIWM = IWindowManager.Stub.asInterface(binder);
使用反射获取ViewServer
:
Class mViewServer = Class.forName("com.android.server.ViewServer");
但是使用关注代码会抛出java.lang.IllegalArgumentException
:
Constructor ct = mViewServer.getDeclaredConstructor(Class.forName("com.android.server.WindowManagerService"));
ct.setAccessible(true);
Object mVSObject = ct.newInstance(mIWM);
ViewServer
构造函数是:
ViewServer(WindowManagerService windowManager) {
...
}
谁能帮助我,非常感谢你!
答案 0 :(得分:0)
我使用的是android 4.0源代码,ViewServer
只有一个构造函数:
ViewServer(WindowManagerService windowManager, int port) {
mWindowManager = windowManager;
mPort = port;
}
但你的代码:
Constructor ct = mViewServer.getDeclaredConstructor(Class.forName("com.android.server.WindowManagerService"));
没有NoSuchMethodException
投掷,因此可能有Constructor
,
你可以试试这个:输入转换并传递这个参数
(WindowManagerService)mIWM
如果也不起作用,建议使用此方法打印ViewServer
全部Constructors
:
class.getDeclaredConstructors();
确保您的参数Constructors
已存在。
答案 1 :(得分:0)
要使用ViewServer,您需要将类ViewServer.java添加到您的项目并在onCreate,onResume和onDestroy中实例化,这是一个例子:
public class ViewServerActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewServer.get(this).addWindow(this);
}
@Override
protected void onResume() {
super.onResume();
ViewServer.get(this).setFocusedWindow(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
ViewServer.get(this).removeWindow(this);
}
}
这是ViewServer.java类ViewServer.java
的网址答案 2 :(得分:0)
试试此代码
Class<?> serviceManagerClass = Class.forName("android.os.ServiceManager");
Class[] cArg = new Class[1];
cArg[0] = String.class;
Method getServiceMethod = serviceManagerClass.getDeclaredMethod("getService", cArg);
getServiceMethod.setAccessible(true);
IBinder wmbinder = (IBinder) getServiceMethod.invoke(null, Context.WINDOW_SERVICE);