对于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()
。这正常吗?我该如何访问?
Answers:
Android有两种类型的API,无法通过SDK访问。
第一个位于package中com.android.internal
。第二种API类型是用@hide Javadoc属性标记的类和方法的集合。
从Android 9(API级别28)开始,Google引入了对非SDK接口使用的新限制,无论是直接,通过反射还是通过JNI。每当应用程序引用非SDK接口或尝试使用反射或JNI获取其句柄时,就会应用这些限制。
但是在API级别28之前,仍可以通过Java反射访问隐藏的方法。该@hide
属性只是Javadoc的一部分(也是droiddoc),因此@hide
仅表示方法/类/字段已从API文档中排除。
例如,中的checkUidPermission()
方法ActivityManager.java
使用@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
public
在开发阶段涉及所有课程。但是它的作用像private
还是/*package*/
像我们这样的用户?
Activity
分散在许多类中,并且它们都需要访问此成员。底线是,它是公共的,但不是API的一部分,这意味着您需要自己承担风险。
该@hide
注解意味着该接口不是公共API的一部分,不应该在你的代码中使用。该方法仅用于AOSP的内部使用。
Google实际上已经开始限制非SDK接口的使用。这包括标有的接口@hide
这些方法分为四个列表:
- 白名单:SDK
- 浅灰色清单:仍可访问的非SDK方法/字段。
- 黑名单:
- 对于目标SDK低于API级别28的应用程序:允许每次使用深灰色列表界面。
- 对于目标SDK为API级别28或更高级别的应用:与黑名单相同的行为
- 黑名单:不受目标SDK限制。该平台的行为就像没有界面一样。例如,当应用程序尝试使用它时,它将抛出NoSuchMethodError / NoSuchFieldException,而当应用程序想知道特定类的字段/方法列表时,它将不包含它。
可以在以下位置找到列表:https : //android.googlesource.com/platform/prebuilts/runtime/+/master/appcompat