您的位置:首页 > 其它

@SystemApi @hide @NonNull @TargetApi

2015-10-10 11:35 253 查看
Android中SystemApi hide NonNull TargetApi
SystemApi hide PrivateApi

NonNull TargetApi

参考信息

Android中@SystemApi @hide @NonNull @TargetApi

我们时常在Android源代码中看到的注释,如SystemApi hide NonNull TargetApi 那么它呢么具体代表什么意思?

@SystemApi @hide @PrivateApi

有关@SystemApi的信息可以首先参见这个链接 ;@SystemApi 是 @PrivateApi的别名;使用@hide标记的API可以不使用@SystemApi进行标;但是当使用@SystemApi标记的API则必须使用@hide

在Android源码中,有两种类型的API无法通过标准的SDK进行访问

如下图所示;



位于com.android.internal包中的

类/方法 被 @hide修饰的

值得注意的是:隐藏的方法(使用@hide修饰的)仍然可以通过java 反射机制进行访问;@hide标识只是javadoc的一部分(也是Android doc的一部分),所以@hide修饰符仅仅指示了method/class/field 不会被暴露到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;
}


但是我们可以通过java的反射机制来访问

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});


下面来看看@SystemApi 和@hide的不同之处

如上文所示:使用@hide修饰的method/class/field,我们仍然何以通过java反射机制进行访问。

但是使用@SystemApi修饰的method/class/field,无法通过java 反射机制进行访问(会触发invocationTargetException异常)

WifiManager manager = (WifiManager) getSystemService(Context.WIFI_SERVICE);

Method method = manager.getClass()
.getMethod("getPrivilegedConfiguredNetworks");
List<WifiConfiguration> configs =
(List<WifiConfiguration>)method.invoke(manager);


列出源码

/**
* Start AccessPoint mode with the specified
* configuration. If the radio is already running in
* AP mode, update the new configuration
* Note that starting in access point mode disables station
* mode operation
* @param wifiConfig SSID, security and channel details as
*        part of WifiConfiguration
* @return {@code true} if the operation succeeds, {@code false} otherwise
*
* @hide Dont open up yet
*/
public boolean setWifiApEnabled(WifiConfiguration wifiConfig, boolean enabled) {
try {
mService.setWifiApEnabled(wifiConfig, enabled);
return true;
} catch (RemoteException e) {
return false;
}
}
/** @hide */
@SystemApi
public List<WifiConfiguration> getPrivilegedConfiguredNetworks() {
try {
return mService.getPrivilegedConfiguredNetworks();
} catch (RemoteException e) {
return null;
}


@NonNull @TargetApi

TargetApi & NonNull如下图所示:

TargetApi



NonNull



TargetApi的常见用法是指定当前class/method/field所使用的api版本,也就是所谓的android 4.4/5.0/5.1/

NonNull常见用于修饰参数,用于表明该参数不为空!

参考信息

github rename PrivateApi to SystemApi

Stackoverflow SystemApi

Stackoverflow @hide
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: