131

Activityソースコードの3898 行目 (一番下に近い):

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

とは@hideどういう意味ですか?

public class ChildActivity extends Activity { ... }を使用/表示できないことがわかりましたActivity.isResumed()。これは正常ですか?どうすればアクセスできますか?

4

3 に答える 3

196

Android には、SDK 経由ではアクセスできない 2 種類の API があります。

最初のものは package にありますcom.android.internal2 番目の API タイプは、 @hide Javadoc 属性でマークされたクラスとメソッドのコレクションです。

Android 9 (API レベル 28) 以降、Google は直接、リフレクション経由、または JNI 経由の非 SDK インターフェースの使用に関する新しい制限を導入しています。これらの制限は、アプリが非 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 に答える