博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android获取应用四大组件列表以及详细信息
阅读量:4144 次
发布时间:2019-05-25

本文共 4474 字,大约阅读时间需要 14 分钟。

我们可以通过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版本不同,字段也有所区别。下面只拿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()即可。

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

public static final int FLAG_MULTIPROCESS = 0x0001;public static final int FLAG_FINISH_ON_TASK_LAUNCH = 0x0002;public static final int FLAG_CLEAR_TASK_ON_LAUNCH = 0x0004;...

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

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

除此之外,还有两个特殊的,一个是theme一个是softInputMode。

先说theme,通过PackageInfo,我们只能拿到themeId,我们知道,想要获取theme名字,可以通过如下方式:

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

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

context.getPackageManager().getResourcesForApplication(packageName);

 

再看softInputMode,我们也是没有办法直接拿到softInputMode对应的可读的描述,但是InputMethodClient提供了相应的方法,不过也是hide方法,复制出来即可。

public static String softInputModeToString(final int softInputMode) {    final StringBuilder sb = new StringBuilder();    final int state = softInputMode & WindowManager.LayoutParams.SOFT_INPUT_MASK_STATE;    final int adjust = softInputMode & WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST;    final boolean isForwardNav =            (softInputMode & WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) != 0;    switch (state) {        case WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED:            sb.append("stateUnspecified");            break;        case WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED:            sb.append("stateUnchanged");            break;        case WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN:            sb.append("stateHidden");            break;        case WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN:            sb.append("stateAlwaysHidden");            break;        case WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE:            sb.append("stateVisible");            break;        case WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE:            sb.append("stateAlwaysVisible");            break;        default:            sb.append("stateUnknown(");            sb.append(state);            sb.append(")");            break;    }    switch (adjust) {        case WindowManager.LayoutParams.SOFT_INPUT_ADJUST_UNSPECIFIED:            sb.append("|adjustUnspecified");            break;        case WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE:            sb.append("|adjustResize");            break;        case WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN:            sb.append("|adjustPan");            break;        case WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING:            sb.append("|adjustNothing");            break;        default:            sb.append("|adjustUnknown(");            sb.append(adjust);            sb.append(")");            break;    }    if (isForwardNav) {        // This is a special bit that is set by the system only during the window navigation.        sb.append("|isForwardNavigation");    }    return sb.toString();}

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

截图来自 android开发工具箱, 

转载地址:http://nucti.baihongyu.com/

你可能感兴趣的文章
VUe+webpack构建单页router应用(一)
查看>>
(python版)《剑指Offer》JZ01:二维数组中的查找
查看>>
Spring MVC中使用Thymeleaf模板引擎
查看>>
深入了解php底层机制
查看>>
PHP中的stdClass 【转】
查看>>
XHProf-php轻量级的性能分析工具
查看>>
OpenCV gpu模块样例注释:video_reader.cpp
查看>>
就在昨天,全球 42 亿 IPv4 地址宣告耗尽!
查看>>
Mysql复制表以及复制数据库
查看>>
Linux分区方案
查看>>
如何使用 systemd 中的定时器
查看>>
git命令速查表
查看>>
linux进程监控和自动重启的简单实现
查看>>
OpenFeign学习(三):OpenFeign配置生成代理对象
查看>>
OpenFeign学习(四):OpenFeign的方法同步请求执行
查看>>
OpenFeign学习(六):OpenFign进行表单提交参数或传输文件
查看>>
Ribbon 学习(二):Spring Cloud Ribbon 加载配置原理
查看>>
Ribbon 学习(三):RestTemplate 请求负载流程解析
查看>>
深入理解HashMap
查看>>
XML生成(一):DOM生成XML
查看>>