Я хотел бы получить информацию о действиях (например, 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.
Любые указания / помощь выше будут действительно полезны.
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.
(доступ к скрытым полям через отражение в любом случае категорически не рекомендуется)