如何从ActivityInfo类获取android:configChanges值

时间:2018-05-02 05:22:49

标签: android android-activity android-manifest android-package-managers

我想获取设备中存在的所有包的活动信息(例如configchanges,resizemode,如果支持Picture in Picture)。

我可以使用带有PackageManager标记的GET_ACTIVITIES来获取活动信息。有了这个,我可以使用configChanges获得ActivityInfo.configChanges值。

但是,如果在android:configChanges中设置了多个配置值,则该值将返回一个随机int。

例如:

如果设置了以下值

  

机器人:configChanges = “uiMode | smallestScreenSize |区域| colorMode |密度”

使用以下代码获取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中看到调试模式中的值。

上述任何线索/帮助都非常有用。

1 个答案:

答案 0 :(得分:1)

configChanges有点掩饰。

要检查是否设置了给定位,您只需使用适当的bitwise operator

例如,要检查是否设置了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);
// ...
  

除此之外,还有任何方法可以获得activity.resizeMode。   我知道它是@hide api。

可靠,没有。您可以通过反思API访问它,尽管Google最近发布了blog post声明如下:

  

从Android的下一个版本开始,一些非SDK方法和   字段将被限制,以便您无法访问它们 - 或者   直接,通过反思,或JNI。

(强烈反对通过反射访问隐藏字段)