mid*_*ite 113 android android-source android-activity
对于Activity
源代码,第3898行(靠近底部):
/**
* @hide
*/
public final boolean isResumed() {
return mResumed;
}
Run Code Online (Sandbox Code Playgroud)
什么@hide
意思?
我发现我public class ChildActivity extends Activity { ... }
不能用/看Activity.isResumed()
.这是正常的吗?我该如何访问它?
Sta*_*kER 176
Android有两种类型的API无法通过SDK访问.
第一个位于com.android.internal包中.第二种API类型是使用@hide javadoc属性标记的类和方法的集合.
从Android 9(API级别28)开始,Google引入了对非SDK接口使用的新限制,无论是直接,通过反射还是通过JNI.只要应用程序引用非SDK接口或尝试使用反射或JNI获取其句柄,就会应用这些限制.
但是在API级别28之前,仍然可以通过java反射访问隐藏方法.@hide属性只是javadoc(也是droiddoc)的一部分,所以@hide只是意味着方法/类/字段被排除在API文档之外.
例如,ActivityManager.java中的checkUidPermission方法是@hide.
/** @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;
}
Run Code Online (Sandbox Code Playgroud)
但是,我们可以通过反思来称呼它.
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});
Run Code Online (Sandbox Code Playgroud)
pax*_*blo 22
@hide
用于因各种原因需要显示但不属于已发布API的内容.当它从源自动提取API时,它们将不会包含在文档中.
你是对的,你无法覆盖它.这是正常的,这是设计的,因为它被标记为final
.您应该能够使用它,尽管编辑器可能不会将其显示为您使用的任何intellisense中的选项之一,因为它标记为@hide
,您应该注意下面的第3点.
您根本不应该使用它,因为它不是API的一部分,开发人员可以随时删除它.他们甚至会在他们的权利范围内,如果他们有悲观的倾向,用一个砖块化它运行的设备的功能取代它(虽然可能没有严格的法律意义).
该@hide
注释意味着该接口不是公共 API 的一部分,不应在您的代码中使用。这些方法仅供 AOSP 内部使用。
Google实际上已经开始限制非sdk接口的使用。这包括标有的接口@hide
这些方法分为四个列表:
- 白名单:SDK
- 浅灰名单:仍可访问的非 SDK 方法/字段。
- 深灰名单:
- 对于目标 SDK 低于 API 级别 28 的应用程序:允许每次使用深灰名单接口。
- 对于目标 SDK 为 API 级别 28 或更高级别的应用:与黑名单相同的行为
- 黑名单:无论目标 SDK 如何,都受到限制。平台的行为就像接口不存在一样。例如,每当应用程序尝试使用它时,它都会抛出 NoSuchMethodError/NoSuchFieldException,并且当应用程序想要知道特定类的字段/方法列表时,它不会包含它。
列表可以在这里找到
归档时间: |
|
查看次数: |
44845 次 |
最近记录: |