如何实例化com.android.server.ViewServer

如何实例化com.android.server.ViewServer,android,reflection,Android,Reflection,在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" }); IWindowMana

在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");
但是使用follow代码将抛出
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) {
    ...
}

谁能帮我,非常感谢

I使用android 4.0源代码,而
ViewServer
只有一个构造函数:

ViewServer(WindowManagerService windowManager, int port) {
        mWindowManager = windowManager;
        mPort = port;
    }
但您的代码:

Constructor ct = mViewServer.getDeclaredConstructor(Class.forName("com.android.server.WindowManagerService"));
没有
NoSuchMethodException
抛出,因此可能有此
构造函数

您可以尝试以下操作:键入convert并传递此参数

(WindowManagerService)mIWM 
如果也不起作用,建议使用以下方法打印
ViewServer
all
constructor

class.getDeclaredConstructors();

要确保带有参数的
构造函数已经存在。

要使用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的url

请尝试以下代码

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); 
Class-serviceManagerClass=Class.forName(“android.os.ServiceManager”);
类别[]cArg=新类别[1];
cArg[0]=String.class;
方法getServiceMethod=serviceManagerClass.getDeclaredMethod(“getService”,cArg);
getServiceMethod.setAccessible(true);
IBinder wmbinder=(IBinder)getServiceMethod.invoke(null,Context.WINDOW\u服务);

你好,白痴老虎,非常感谢!ViewServer是Android源代码,它有两个构造函数:一个是“com.Android.server.ViewServer(com.Android.server.WindowManagerService)”,另一个是“com.Android.server.ViewServer(com.Android.server.WindowManagerService,int)”。我尝试过:(WindowManagerService)mIWM,但WindowManagerService是Android源代码,所以我不知道怎么投mIWM。你知道,mIWM正在另一个进程中,它是WindowManagerService的一个实例。嗨@Peter Lawrey,你有什么想法吗?谢谢。嗨@Commonware,bold你有什么想法吗?Thanks@VonC,你知道吗?谢谢,我怀疑一个问题是你假设你的
IWindowManager
是一个
WindowManagerService
。如果您在调试器中查看它,或者只是输出它的
getClass()
,我想您会发现它实际上是一个
IWindowManager.Stub.Proxy