0

在 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) {
    ...
}

谁能帮帮我,非常感谢!

4

3 回答 3

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); 
于 2015-04-15T12:46:53.613 回答
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

你可以试试这个:输入convert并传递这个参数

(WindowManagerService)mIWM 

如果也不起作用,建议使用此方法打印ViewServer所有内容:Constructors

class.getDeclaredConstructors();

以确保Constructors你的论点已经存在。

于 2012-04-17T10:05:40.973 回答
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类的 url

于 2013-09-27T15:51:01.213 回答