131

对于Activity源代码,第 3898 行(靠近底部):

/**
 * @hide
 */
public final boolean isResumed() {
    return mResumed;
}

是什么@hide意思?

我发现我public class ChildActivity extends Activity { ... }无法使用/查看Activity.isResumed()。这是正常的吗?我怎样才能访问它?

4

3 回答 3

196

Android 有两种无法通过 SDK 访问的 API。

第一个位于 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});
于 2013-06-12T02:08:41.360 回答
26
  1. @hide用于出于各种原因需要可见但属于已发布 API 的内容。当它自动从源中提取 API 时,它们不会包含在文档中。

  2. 你是对的,你不能覆盖它。这是正常的,这是设计使然,因为它被标记为final. 您应该可以使用它,尽管编辑器可能不会将它作为它使用的任何智能感知中的选择之一显示给您,因为它标有@hide,您应该注意下面的第 3 点。

  3. 您根本应该使用它,因为它不是 API 的一部分,开发人员可以随时删除它。他们甚至会在他们的权利范围内,如果他们有虐待倾向的话,可以用一个功能来取代它,这个功能会阻碍它运行的设备(尽管可能不是严格的法律意义上的)。

于 2013-06-11T01:44:28.303 回答
4

注释意味着此接口不是公共 API的@hide一部分,不应在您的代码中使用。这些方法仅供 AOSP 内部使用。

Google 实际上已经开始限制非 sdk 接口的使用。这包括标有@hide

这些方法分为四个列表:

  • 白名单:SDK
  • light-greylist:仍然可以访问的非 SDK 方法/字段。
  • 深灰名单:
  • 对于目标 SDK 低于 API 级别 28 的应用程序:允许每次使用深灰名单接口。
  • 对于目标 SDK 为 API 级别 28 或更高级别的应用:与黑名单行为相同
  • 黑名单:不受目标 SDK 限制。平台的行为就像没有接口一样。例如,当应用程序尝试使用它时,它会抛出 NoSuchMethodError/NoSuchFieldException,当应用程序想知道特定类的字段/方法列表时,它不会包含它。

列表可以在这里找到

于 2018-10-11T13:05:32.897 回答