Что означает @hide в исходном коде Android?


на Activity исходный код, строка 3898 (ближе к нижней части):

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

Что значит @hide в смысле?

я нашла свою public class ChildActivity extends Activity { ... } не может использовать/см. Activity.isResumed(). Это нормально? Как я могу получить к нему доступ?

2 100

2 ответа:

Android имеет два типа API, которые не доступны через SDK.

первый находится в пакете com.андроид.внутренний. Второй тип API-это набор классов и методов, отмеченных символом @скрыть атрибут javadoc.

скрытые методы все еще могут быть доступны через отражение 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});

обновление: Опубликовал Google блоге указывает, что он начинает ограничивать доступ к недокументированным или скрытым API в Android. Так что называть это размышлением сейчас очень неохотно. Пожалуйста, имейте это в виду.

  1. @hide используется для вещей, которые должны быть видны по разным причинам, но не часть опубликованного API. Они не будут включены в документацию, когда он автоматически извлекает API от источника.

  2. вы правы, вы не можете переопределить его. Это нормально, это по дизайну, так как он помечен как final. Вы должны быть в состоянии использовать это, хотя редактор не может показать его вам как один из выбор в любом intellisense он использует, потому что он отмечен @hide, а вы должны принять к сведению пункт 3 ниже.

  3. вы должны не используйте его вообще, так как он не является частью API, и разработчики могут удалить его, когда захотят. Они даже были бы в пределах своих прав, если бы они были склонны к садизму, чтобы заменить его функцией, которая замуровала устройство, на котором он работал (хотя, возможно, не в строгом юридическом смысле).