使用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);}}
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());}}
这样就行了!
- 使用Android SDK中的隐藏类
- 关于Android sdk隐藏接口的使用
- Android studio使用SDK隐藏API方法
- 使用Android隐藏类和隐藏方法
- 使用Android隐藏类和隐藏方法
- 使用Android隐藏类和隐藏方法
- 使用Android隐藏类和隐藏方法
- 使用Android隐藏类和隐藏方法
- 使用Android隐藏类和隐藏方法
- 使用Android隐藏类和隐藏方法
- 使用Android隐藏类和隐藏方法
- 使用Android隐藏类和隐藏方法
- 使用Android隐藏类和隐藏方法
- Android Studio中的SDK Manager使用
- android隐藏类的使用
- Android 隐藏类的使用
- Android中调用隐藏类中的方法
- Android中的隐藏API和Internal包的使用
- cocos2d-x 3.4 sprite3d c3b 模型无法显示的问题
- nfs原理
- Ref和Out
- IOS9之Xcode7允许Http
- C# FileStream Write追加写入文本
- 使用Android SDK中的隐藏类
- strtok、strtok_s、strtok_r 字符串分割函数
- 安卓(android)开发应该怎么学?需要哪些基础知识?
- 程序员的噩梦,我的漏洞伤害了他人
- 20+条软件开发的经验教训
- WebView基本使用
- 在Mesos上创建Rancher容器服务
- 压缩图片
- Project 入门