对于Activity
源代码,第3898行(接近底部):
/**
* @hide
*/
public final boolean isResumed() {
return mResumed;
}
@hide
是什么意思?
我发现我的 public class ChildActivity extends Activity { ... }
无法使用/查看 Activity.isResumed()
。这正常吗?如何访问它?
对于Activity
源代码,第3898行(接近底部):
/**
* @hide
*/
public final boolean isResumed() {
return mResumed;
}
@hide
是什么意思?
我发现我的 public class ChildActivity extends Activity { ... }
无法使用/查看 Activity.isResumed()
。这正常吗?如何访问它?
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;
}
然而,我们可以通过反射来调用它:
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});
@hide
用于需要出于各种原因可见但不是发布API的一部分。它们在自动从源代码提取API时不会包含在文档中。
你说得对,你无法覆盖它。这是正常情况,这是设计上的问题,因为它被标记为final
。尽管编辑器可能由于被标记为@hide
而不显示它作为智能感知中的选择之一,但应该可以使用它,并且您应该注意下面的第3点。
您根本就不应该使用它,因为它不是API的一部分,开发人员可以随时删除它。如果他们遭受了虐待倾向,甚至可以用使设备变砖的功能替换它(虽然从严格的法律意义上来说可能不行)。
final
,当然我不能覆盖它。抱歉,那是我的错误 :x - midnite@hide
注解表示该接口不是公共 API 的一部分,不应在代码中使用。这些方法仅供 AOSP 内部使用。@hide
的接口。
- 白名单:SDK
- 浅灰名单:仍然可以访问非 SDK 方法/字段。
- 深灰名单:
- 针对目标 SDK 低于 API 级别 28 的应用程序:允许使用深灰名单接口。
- 针对目标 SDK 为 API 级别 28 或更高版本的应用程序:与黑名单相同的行为
- 黑名单:无论目标 SDK 如何都受到限制。平台将表现得好像接口不存在。例如,每当应用程序尝试使用它时,它将抛出 NoSuchMethodError/NoSuchFieldException,并且在应用程序想要知道特定类的字段/方法列表时,不会包括它。
这些列表可以在这里找到