使用Android SDK中的隐藏类

来源:互联网 发布:云计算机房 编辑:程序博客网 时间:2024/05/16 07:01

先以StackOverflow上的一个问题作为引入, http://stackoverflow.com/questions/17035271/what-does-hide-mean-in-the-android-source-code

大致意思是这样的:

Activity 的源码中,第 3898 行,有一个hide注解,

/** * @hide */public final boolean isResumed() {    return mResumed;}

1、hide标记的作用?

2、但是发现在继承Activity的子类中并无法使用该方法?

3、如何才能使用该方法?

下面是回答------------------------------------------------------------

Android的通过SDK不可访问的API分为两种:

第一种是在com.android.internal包下的

第二种是加了hide注解的

但是第二种也就是隐藏的类或者方法是可以通过反射机制去调用的。

例子如下:

ActivityManager下的checkUidPermission方法也是一个隐藏方法.

/** @hide */public static int checkUidPermission(String permission, int uid) {    try {        return AppGlobals.getPackageManager()                .checkUidPermission(permission, uid);    } catch (RemoteException e) {        // Should never happen, but if it does... deny!        Slog.e(TAG, "PackageManager is dead?!?", e);    }    return PackageManager.PERMISSION_DENIED;}

我们可以通过如下代码使用这个方法

Class c;c = Class.forName("android.app.ActivityManager");Method m = c.getMethod("checkUidPermission", new Class[] {String.class, int.class});Object o = m.invoke(null, new Object[]{"android.permission.READ_CONTACTS", 10010});
以下附invoke方法的使用说明:

参数:
obj - 从中调用底层方法的对象
args - 用于方法调用的参数 
返回:
使用参数 args 在 obj 上指派该对象所表示方法的结果 
抛出: 
IllegalAccessException - 如果此 Method 对象强制执行 Java 语言访问控制,并且底层方法是不可访问的。 
IllegalArgumentException - 如果该方法是实例方法,且指定对象参数不是声明底层方法的类或接口(或其中的子类或实现程序)的实例;如果实参和形参的数量不相同;如果基本参数的解包转换失败;如果在解包后,无法通过方法调用转换将参数值转换为相应的形参类型。 
InvocationTargetException - 如果底层方法抛出异常。 
NullPointerException - 如果指定对象为 null,且该方法是一个实例方法。 
ExceptionInInitializerError - 如果由此方法引起的初始化失败。

同理,如果需要使用到隐藏类的某个方法,也可以通过这种方法获取,为了方便说明,自己定义一个隐藏类吧

</pre><p><pre name="code" class="java">package com.example.testboot;/** @hide */public class Hide {public void out(String msg){android.util.Log.e("cxq", msg);}}


如果要使用out方法

public void testMyHideClass() {try {Class c;c = Class.forName("com.example.testboot.Hide");Object obj = c.newInstance();Method m = c.getMethod("out", new Class[] {String.class });Object o = m.invoke(obj, new Object[] {"This is cxq msg!"});} catch (Exception e) {// TODO: handle exceptione.printStackTrace();android.util.Log.e("cxg", e.getMessage());}}

这样就行了!



0 0