首先声明,所用代码皆是基于google开源代码
举个例子:PackageParser.java 定义了一个注解类型 ParseFlags,PackageManagerService.java里面用的时候final @ParseFlags int reparseFlags 只能用PARSE_XXX赋值
public static final int PARSE_MUST_BE_APK = 1 << 0;
public static final int PARSE_IGNORE_PROCESSES = 1 << 1;
public static final int PARSE_EXTERNAL_STORAGE = 1 << 3;
public static final int PARSE_IS_SYSTEM_DIR = 1 << 4;
public static final int PARSE_COLLECT_CERTIFICATES = 1 << 5;
public static final int PARSE_ENFORCE_CODE = 1 << 6;
public static final int PARSE_CHATTY = 1 << 31;
@IntDef(flag = true, prefix = { "PARSE_" }, value = {
PARSE_CHATTY,
PARSE_COLLECT_CERTIFICATES,
PARSE_ENFORCE_CODE,
PARSE_EXTERNAL_STORAGE,
PARSE_IGNORE_PROCESSES,
PARSE_IS_SYSTEM_DIR,
PARSE_MUST_BE_APK,
})
@Retention(RetentionPolicy.SOURCE)
public @interface ParseFlags {}
final @ParseFlags int reparseFlags;
final @ScanFlags int rescanFlags;
if (FileUtils.contains(privilegedAppDir, scanFile)) {
reparseFlags =//赋值
mDefParseFlags |
PackageParser.PARSE_IS_SYSTEM_DIR;
这样做的的好处就是代码高逼格,简洁
-
@IntDef @Retention 的定义 {SOURCE CLASS RUNTIME}
上面这些注解是framework开发可以用到的,并不开放给应用 ,做应用开发可以自己定义注解自己用
注解与反射结合起来可以实现接口隔离,回调