这是一篇我个人在EOE发的blog《检查获取系统中特定的类名和方法》,由于eoe的blog系统实在是无言以对,我就把eoe上面的帖子以及blog是都转到csdn上来,原帖地址:http://www.eoeandroid.com/blog-781265-49611.html
项目中遇到一个问题,在delete or save a contact 之后会发送Broadcaster来通知系统更新一些数据,而这个BroadcasterReceiver是google原生所提供的,正常情况下是存在,而且work的,但是一部分oem厂商把系统的一些标准接口改的乱七八糟的,导致一些正常的功能我们无法去调用或者使用,那么我们就需要再使用这个功能之前,去检查相应的类是否存在,存在之后再去执行我们的操作,code如下:
private static boolean checkReceiver(Context context) {
try {
Context otherContext = context.createPackageContext("com.android.phone",//com.android.phone是我们需要检查的类所在的包名
Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);
if (otherContext != null) {
Class<?> clazz = otherContext.getClassLoader().loadClass(
"com.android.phone.CallerInfoCacheUpdateReceiver");// 我们需要检查的类的完整类路径
if (clazz != null) {
Method method = clazz.getDeclaredMethod("onReceive", Context.class,
Intent.class);//通过反射拿到特定的方法,我这里只是为了检测是否是正确的类,但其实我们可以通过这些方法去invoke,然后达到更深的目的,具体不多说了
if (method != null) {
return true;
}
}
}
} catch (NameNotFoundException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
return false;
}