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

我可以使用带有PackageManager标志的GET_ACTIVITIES来获取活动信息。这样我就可以使用configChanges获得ActivityInfo.configChanges值。

但是,如果在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是位掩码。

要检查是否设置了给定的位,您只需要使用适当的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。


可靠地,没有。尽管Google最近发布了blog post声明以下内容,但您也许可以通过反射API访问它:


  从下一版Android开始,一些非SDK方法和
  字段将受到限制,以使您无法访问它们-
  直接通过反射或JNI。


(强烈建议不要通过反射访问隐藏的字段)

关于android - 如何从ActivityInfo类获取android:configChanges值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50127593/

10-10 23:32