Как получить значения android: configChanges из класса ActivityInfo

Я хотел бы получить информацию о действиях (например, configchanges, resizemode, если поддерживается картинка в картинке) всех пакетов, присутствующих на устройстве.

Я могу получить информацию о деятельности, используя PackageManager с флагом GET_ACTIVITIES. С этим я могу получить значение configChanges, используя ActivityInfo.configChanges.

Однако значение возвращает случайный тип int, если в android:configChanges установлено несколько значений конфигурации.

Например:

если установлены ниже значения

android:configChanges = "uiMode|smallestScreenSize|locale|colorMode|density"

Получение значения configchanges с использованием кода ниже

PackageInfo packageInfo = mPackageManager.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES);

ActivityInfo activityInfo[] = packageInfo.activities;

if (activityInfo!=null) {
    for(ActivityInfo activity : activityInfo) {
      int configChange = activity.configChanges;
    }
}

Я получаю значение activity.configChanges как 23047

Что означает 23047, как мне его декодировать, чтобы получить значения конфигурации, установленные в AndroidManifest.xml

Вдобавок есть ли способ получить activity.resizeMode. Я так понимаю, это @hide api. Я вижу значение в режиме отладки, хотя и в Android Studio.

Любые указания / помощь выше будут действительно полезны.

2
0
307
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

configChanges - это битовая маска.

Чтобы проверить, установлен ли данный бит, вам просто нужно использовать соответствующий побитовый оператор.

Например, чтобы проверить, установлен ли uiMode, вы можете сделать что-то вроде этого:

int configChanges = activityInfo.configChanges;

if ((configChanges & ActivityInfo.CONFIG_UI_MODE) == ActivityInfo.CONFIG_UI_MODE) {
    // uiMode is set
} else {
    // uiMode is not set
}

Определение метода может упростить:

public boolean isConfigSet(int configMask, int configToCheck) {
    return (configMask & configToCheck) == configToCheck;
}

И вы бы назвали это так:

int configChanges = activityInfo.configChanges;

boolean uiModeSet = isConfigSet(configChanges, ActivityInfo.CONFIG_UI_MODE);
boolean colorModeSet = isConfigSet(configChanges, ActivityInfo.CONFIG_COLOR_MODE);
// ...

In Addition to that is there any way we can get activity.resizeMode . I understand that it is @hide api.

Надежно нет. Возможно, вы сможете получить к нему доступ через API отражения, хотя Google недавно выпустил Сообщение блога, в котором говорится следующее:

Starting in the next release of Android, some non-SDK methods and fields will be restricted so that you cannot access them -- either directly, via reflection, or JNI.

(доступ к скрытым полям через отражение в любом случае категорически не рекомендуется)

Другие вопросы по теме