对于Activity
source code,第3898行(靠近底部):
/**
* @hide
*/
public final boolean isResumed() {
return mResumed;
}
@hide
是什么意思?
我发现我的public class ChildActivity extends Activity { ... }
无法使用/查看Activity.isResumed()
。这是正常的吗?我该如何访问它?
答案 0 :(得分:168)
Android有两种无法通过SDK访问的API。
第一个位于com.android.internal包中。第二种API类型是标有@hide javadoc attribute的类和方法的集合。
从Android 9(API级别28)开始,Google引入new restrictions on the use of non-SDK interfaces,无论是直接,通过反射还是通过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});
答案 1 :(得分:21)
@hide
用于因各种原因需要显示的内容,但不是已发布API的一部分。当它从源代码中自动提取API时,它们将不会包含在文档中。
你是对的,你无法覆盖它。这是正常的,这是设计的,因为它被标记为final
。您应该能够使用它,尽管编辑器可能不会将其显示为您使用的任何intellisense中的选项之一,因为它标有@hide
,您应该注意到第3点。
你应该不使用它,因为它不是API的一部分,开发人员可以随时删除它。他们甚至会在他们的权利范围内,如果他们是悲观的倾向,用一个砖块化它运行的设备的功能取代它(虽然可能不是严格的法律意义上的。)
答案 2 :(得分:1)
@hide
注释表示此接口不是公共API的一部分,因此不应在您的代码中使用。这些方法仅供内部使用的AOSP。
Google实际上已经开始restrict the usage of non-sdk interfaces。这包括标有@hide
方法分为四个列表:
- 白名单:SDK
- 浅灰色列表:仍可访问的非SDK方法/字段。
- 黑名单:
- 对于目标SDK低于API级别28的应用:允许每次使用深灰色列表界面。
- 对于目标SDK为API级别28或更高的应用:与黑名单相同的行为
- 黑名单:不受目标SDK限制。该平台的行为就像没有接口一样。例如,它将抛出 每当应用尝试尝试NoSuchMethodError / NoSuchFieldException时 使用它,并且在应用程序想要了解以下内容的列表时将不包含它: 特定类别的字段/方法。
可以在这里找到列表:https://android.googlesource.com/platform/prebuilts/runtime/+/master/appcompat