Android开发中怎样使用隐藏的API
Android应用中有时为了实现某些特殊的功能或效果,往往需要使用一些谷歌隐藏的API(加有@hide标记的public类、方法或常量),例如PolicyManager。
使用Android隐藏的API主要有两种办法:1.利用Java反射机制,使用反射的方法得到隐藏API;2.使用源码编译时生成的全编译过的classes.jar包。
举例说明,下面的代码如果直接使用会报错。
- mWindowManager = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
- mWindow = PolicyManager.makeNewWindow(mContext);
- mWindow.setWindowManager(mWindowManager, null, null);
1,使用Java反射机制,改为以下代码,就可以正常使用了。
- mWindowManager = (WindowManager) mContext
- .getSystemService(Context.WINDOW_SERVICE);
- // using reflect mechanism to invoke hide api
- String POLICYMANAGER_CLASS_NAME = "com.android.internal.policy.PolicyManager";
- try {
- Class policyClass;
- policyClass = Class.forName(POLICYMANAGER_CLASS_NAME);
- Log.i(TAG, policyClass.toString());
- Method meths[] = policyClass.getMethods();
- Method makenewwindow = null;
- // Method makenewwindow = policyClass.getMethod("makeNewWindow");
- for (int i = 0; i < meths.length; i++) {
- if (meths[i].getName().endsWith("makeNewWindow"))
- makenewwindow = meths[i];
- }
- Log.i(TAG, makenewwindow.toString());
- mWindow = (Window) makenewwindow.invoke(null, mContext);
- } catch (Exception e) {
- e.printStackTrace();
- }
- mWindow.setWindowManager(mWindowManager, null, null);
此时,本文最开始的那段代码不需要再做改动就可以生效了。
利用反射机制使用隐藏API的方法优点是灵活,能够在不兼容的系统捕获异常,而使程序不至于崩溃;缺点是过程太繁杂,而且对于隐藏类的继承等很难实现。如果需要大量使用隐藏API,使用反射无疑会让人厌烦。
通过导入全编译的classes.jar包来实现对隐藏API的使用方法简单,容易编程,就像是那些隐藏的API在SDK中变得可见了一样,其缺点就是兼容性问题,希望使用者引起重视。
两种方法各有利弊,请大家斟酌使用。一般来说,谷歌设置隐藏API的主要原因在于Android系统本身还在不断的进化发展中,这些API可能还不够成熟、稳定。因此除非特殊情况,应尽量减少对隐藏API的使用。
相关推荐
liuqipao 2020-07-07
IT之家 2020-03-11
graseed 2020-10-28
zbkyumlei 2020-10-12
SXIAOYI 2020-09-16
jinhao 2020-09-07
impress 2020-08-26
淡风wisdon大大 2020-06-06
yoohsummer 2020-06-01
chenjia00 2020-05-29
baike 2020-05-19
扭来不叫牛奶 2020-05-08
hxmilyy 2020-05-11
黎豆子 2020-05-07
xiongweiwei00 2020-04-29
Cypress 2020-04-25
冰蝶 2020-04-20