android获取应用四大组件列表以及详细信息

栏目: IT技术 · 发布时间: 5年前

内容简介:我们可以通过PackageManager获取PackageInfo,既而获得应用包相关的各种信息,除了之前说过的可以获取包名、版本号、图标、入口Activity、Application、文件md5/sha1/sha256等等,我们还可以获取应用的四大组件列表,以及组件具体详情。获取PackageInfo要注意flags参数,否则获取不到相应信息。其中,对于组件来说,有两个字段我最关心:

我们可以通过PackageManager获取PackageInfo,既而获得应用包相关的各种信息,除了之前说过的可以获取包名、版本号、图标、入口Activity、Application、文件md5/sha1/sha256等等,我们还可以获取应用的四大组件列表,以及组件具体详情。

PackageInfo info = pm.getPackageInfo(mPackageName, PackageManager.GET_ACTIVITIES
        | PackageManager.GET_RECEIVERS
        | PackageManager.GET_SERVICES
        | PackageManager.GET_PROVIDERS
        | PackageManager.GET_INTENT_FILTERS
        | PackageManager.GET_META_DATA
        | PackageManager.GET_DISABLED_COMPONENTS);

获取PackageInfo要注意flags参数,否则获取不到相应信息。

info.activities; //activity列表, ActivityInfo[]类型
info.receivers; //broadcast receiver列表 ActivityInfo[]类型
info.services; //service列表, ServiceInfo[]类型
info.activities; //provider列表, ProviderInfo[]类型

其中,对于组件来说,有两个字段我最关心:

info.exported;
info.enabled;

自此,我们做一个显示应用的四大组件列表功能所需的一切就都齐了。

截图来自 android开发 工具 箱, 点我下载 android开发工具箱

android获取应用四大组件列表以及详细信息

组件详情就比较麻烦了,因为四大组件的属性都不一样,而且由于android版本不同,字段也有所区别。下面只拿Activity举例。

有一些字段我们是可以直接从ActivityInfo获取的,比如

info.enabled;
info.exported;
info.processName;
info.permission;
info.parentActivityName;

有一些字段,我们需要做一下映射,比如launchMode。info.launchMode是int类型

public class ActivityInfo extends ComponentInfo implements Parcelable {
    public static final int LAUNCH_MULTIPLE = 0;
    public static final int LAUNCH_SINGLE_TOP = 1;
    public static final int LAUNCH_SINGLE_TASK = 2;
    public static final int LAUNCH_SINGLE_INSTANCE = 3;
}

除了launchMode之外,colorMode、screenOrientation、uiOptions等等也是需要进行类似的转换的。

如果不想写很多的switch-case之类的代码,也可以使用反射。比如launchMode,我们可以将`ActivityInfo`类中,所有静态且以LAUNCH_开头的常量一一遍历,与info.launchMode值相同的话,我们显示field.getName()即可。

还有一种情况,比如softInputMode、configChanges等字段,是多种类型的组合,我们也一样可以使用反射。以configChanges为例:

public static final int CONFIG_MCC = 0x0001;
public static final int CONFIG_MNC = 0x0002;
public static final int CONFIG_LOCALE = 0x0004;
...

只是我们不能使用相等来作为判断条件了,需要做个位运算:

if ((flags & fieldValue) == fieldValue) {
    //满足条件,field.getName()
}

除此之外,还有一个特殊一点的theme,通过PackageInfo,我们只能拿到themeId,我们知道,想要获取theme名字,可以通过如下方式:

resources.getResourceName(themeId);
//或者
resources.getResourceEntryName(themeId);

需要注意的是,我们不能使用自己的Resources对象来获取其他应用的主题信息,我们需要拿到对应应用的Resources

context.getPackageManager().getResourcesForApplication(packageName);

这样,我们就拿到Activity相关的所有信息。另外三个组件也类似,不再一一演示。

android获取应用四大组件列表以及详细信息

截图来自 android开发工具箱, 点我下载 android开发工具箱


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

免费

免费

[美] 克里斯·安德森 / 蒋旭峰、冯斌、璩静 / 中信出版社 / 2009-9 / 39.00

在《免费:商业的未来 》这本书,克里斯·安德森认为,新型的“免费”并不是一种左口袋出、右口袋进的营销策略,而是一种把货物和服务的成本压低到零的新型卓越能力。在上世纪“免费”是一种强有力的推销手段,而在21世纪它已经成为一种全新的经济模式。 究竟什么是免费商业模式?根据克里斯·安德森的说法,这种新型的“免费”商业模式是一种建立在以电脑字节为基础上的经济学,而非过去建立在物理原子基础上的经济学。......一起来看看 《免费》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器