1、方法在Manager、IBinder 与Service 中申明定义
反射获取Manager 中方法:
ActivityManager mAms = (ActivityManager) this.getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
try { Method testDeepFreezerObjectLock = mAms.getClass().getMethod("testDeepFreezerObjectLock", int.class); try { testDeepFreezerObjectLock.invoke(mAms, 5000); Log.d(TAG, "test object lock end"); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } }catch (SecurityException e){ e.printStackTrace(); }catch (NoSuchMethodException e){ e.printStackTrace(); }
2、方法没有在Manager中申明定义,只在IBinder 与Service 中什申明定义
反射获取服务中方法:
try { Object obj; Class ServiceManager = Class.forName("android.os.ServiceManager"); Method getService = ServiceManager.getMethod("getService", String.class); Object oRemoteService = getService.invoke(null, Context.WINDOW_SERVICE); Class cStub = Class.forName("android.view.IWindowManager$Stub"); Method asInterface = cStub.getMethod("asInterface", android.os.IBinder.class); obj = asInterface.invoke(null, oRemoteService); Method fun = obj.getClass().getMethod("getInitialDisplaySize", int.class,Point.class); Point initialSize = new Point(); fun.invoke(obj, Display.DEFAULT_DISPLAY, initialSize); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); }
正常获取服务中方法:
Point initialSize = null; try { android.view.IWindowManager binder = android.view.IWindowManager.Stub.asInterface( ServiceManager.getService(Context.WINDOW_SERVICE)); binder.getInitialDisplaySize(Display.DEFAULT_DISPLAY, initialSize); }catch (RemoteException re){ re.printStackTrace(); }