一、前言

开门见山,开篇明义。有些场景下,我们会需要获取一些其它 App 的各项信息,例如:App 名称,包名、Icon 等。这个时候就需要使用到 PackageManager 这个类了。

本篇就 PackageManager 的使用,做一个详尽的讲解,助你拿到各项 App 的信息,当然也包括一些未安装的 App 的信息。

二、需要提前了解的一些类

当你需要获取到指定 App 的各项信息的时候,你需要操作一些 Android 为我们提供的对应的 Api。

你首先需要获取 PackageManager(以下简称 PM) 对象,通过 PM 对象,你就可以获取到你需要的各项 App 的信息类。

这里涉及到的 App 信息类包括:PackageInfo、ApplicationInfo、ActivityInfo/ServiceInfo/ProviderInfo 等,还有一个 ResolveInfo 类,它比较特殊一点,不和前面的结构为从属关系。

这些类,都可以在根据 AndroidManifest.xml 中定义的组件进行划分,大概的结构如下。

可以看到,它们之间的关系还它挺复杂的。

一个 PackageInfo 对应一个 ApplicationInfo,而其中又包含若干个 ActivityInfo、ServiceInfo、ProviderInfo。

2.1 PackageManager

PackageManager 是一个抽象类,我们一般操作的 PackageManager ,实际上是它的实现类 ApplicationPackageManager 这个对象。

在 Context 中,就有获取 PM 对象的方法,getPackageManager(),所以四大组件想要获取它是非常简单的。

PM 中,提供了非常多的方法,供我们通过不同的条件,获取到 PackageInfo 对象、ApplicationInfo 对象等,它是本文的基础。

2.2 PackageInfo

PackageInfo 从名称上也可以看出来,它主要用于存储获取到的 Package 的一些信息,包括:包名(packageName)、版本号(versionCode)、版本名(versionName)。

基本上拿到了 PackageInfo ,你就可以拿到大部分此 Apk 相关的信息了。

并且,PackageInfo 中有一个 applicationInfo 的字段,是可以直接获取到与它相关的 ApplicationInfo 对象的。

这里介绍几个 PackageInfo 中,比较常用的字段:

  • packageName:包名。
  • versionCode:版本号
  • versionName:版本名。
  • firstInstallTime:首次安装时间。
  • lastUpdateTime:最后一次覆盖安装时间。

2.3 ApplicationInfo

ApplicationInfo 相对于 PackageInfo 用的会比较少一些。它主要用于获取 Apk 定义在 AndroidManifest.xml 中的一些信息。

这里介绍几个比价常用的:

  • packageName:包名
  • targetSdkVersion:目标 SDK 版本。
  • minSdkVersion:最小支持 SDK 版本,有 Api 限制,最低在 Api Level 24 及以上支持。
  • sourceDir:App 的 Apk 源文件存放的目录。
  • dataDir:data 目录的全路径。
  • metaData:Manifest 中定义的 meta 标签数据。
  • uid:当前 App 分配的 uid。

可以看到 ApplicationInfo 涵盖的信息,基本上都是在 AndroidManifest.xml 中定义的信息,并且有一些属性是有 Api Level 限制的,所以不确定的属性,提前看一下文档,确定是否全版本支持。

2.4 ActivityInfo

ActivityInfo、ServiceInfo、ProviderInfo 这三个是平级的,熟悉的一眼就能看出来,它们就是 Android 定义的四大组件中的几个。各自涵盖了一部分信息。一般在外部获取其他 App 的信息的时候,不会获取到这么细致的数据,如果有,看看这几个类准没错。

那么就不再费时去介绍它们了。

三、基本操作

到现在基本上就已经了解到在当前设备上获取到 Apk 信息的各项类了。

直接摆源码说属性有点枯燥。接下来我们就带着实际问题,来看看具体如何使用 PM。

3.1 获取所有安装的 App

如果想要获取当前设备上已经安装的所有 App,可以使用 getInstalledPackages() 方法获取到它所有的已安装 App 的 PackageInfo 。

PackageManager 中,很多方法都会需要传递一个 flags 的字段,它表示你当前需要获取到的 App 的信息。取值范围有挺多的,获取不同的信息使用不同的 Flags,通常如果没有额外的要求,直接使用 GET_ACTIVITYS 即可。

3.2 判断 App 是否安装

这里主要说的是通过包名,判断 App 是否安装在当前设备上。

最简单的逻辑就是去获取 PackageInfo ,如果能拿回来数据,就说明是有安装的。

3.3 通过包名获取PackageInfo

其实前面判断 App 是否安装的时候,就已经获取到了 PackageInfo 信息,这里只需要将它返回出去即可。

3.4 获取版本号和版本名

这里只需要根据 PackageInfo 中的字段,获取到对应的值就好了。

3.5 获取 App 的名称

获取 App 的名称,就需要用到 ApplicationInfo 这个对象了,其中 loadLabel() 方法返回的,就是 App 的名称。

3.6 获取 App 的 Icon

在 ApplicationInfo 中,还可以通过 loadIcon() 获取到 App 的 Icon。它返回的是一个 Drawable 对象,可以直接使用。

3.5 根据Apk 文件,获取 PackageInfo

前面介绍的方法,都是基于一个已安装的 App 的包名,来获取额外的信息。

但是有时候,我们只有一个未安装的 Apk 文件,想要解析出 Apk 文件中的额外信息,PM 中,也有对应的 Api。非常的方便,直接使用 getPackageArchiveInfo() 即可。

只要拿到这个 Apk 文件相关的 PackageInfo 信息,就有办法拿到其他的名称、icon 、版本号、版本名、包名等信息。和前面介绍的例子类似,这里就不再一一列举了。

四、查缺补漏

整体来说,到这里已经讲解清楚如何使用 PM 获取 App 的基本信息。

但是并不包含 App 在运行时的一些内存的情况,哪些数据你想获取,单单依靠 PackageManager 是做不到的,就不再这里展开说了,有机会再详细说明一下。

还有就是,PM 中,很多方法,都是有可能触发 『Package manager has died』这个 RuntimeException 的,其实就是很多个线程在频繁调用。如果想要避免,加锁加缓存即可。具体的情况,可以看看我之前的文章《PackageManager可以乱用吗?》。

今天在承香墨影公众号的后台,回复『成长』。我会送你一些我整理的学习资料,包含:Android反编译、算法。Web项目源码。

推荐阅读:

点赞或者分享吧~

通过 PackageManager 获得你想要的 App 信息的更多相关文章

  1. 十九. 想快速开发app,需要找外包吗?

    健生干货分享:第19篇 摘要:最近和两位准备开发app的创业者聊天,他们之前没有移动互联网的相关经验,有的是想法和资金.他们在纠结:想快速开发app,需要找外包吗? 最近和两位想开发app的创业者聊天 ...

  2. Android 开发 获取设备信息与App信息

    设备信息 设备ID(DeviceId) 获取办法 android.telephony.TelephonyManager tm = (android.telephony.TelephonyManager ...

  3. Android中获取系统上安装的APP信息

    Version:0.9 StartHTML:-1 EndHTML:-1 StartFragment:00000099 EndFragment:00003259 Android中获取系统上安装的APP信 ...

  4. [App Store Connect帮助]三、管理 App 和版本(2.7)输入 App 信息:添加 iMessage 信息版 App 的 App 信息

    您可以使用 Messages framework(Messages 框架)来创建贴纸包或 iMessage 信息版 App(可在 iMessage App Store 中获取).可作为独立 App,也 ...

  5. [App Store Connect帮助]三、管理 App 和版本(2.5)输入 App 信息:本地化 App Store 信息

    在添加 App 至您的帐户之后,您可以在“App 信息”页面添加语言并输入本地化元数据.若要查看受支持的语言列表,请参见 App Store 本地化.若要了解您可以本地化的属性,请参见必填项.可本地化 ...

  6. [App Store Connect帮助]三、管理 App 和版本(2.1)输入 App 信息:查看和编辑 App 信息

    在您添加 App 至您的帐户后,您也可以在“我的 App”部分查看和编辑 App 信息和平台版本信息. 在输入 App 信息前,请检查必填项.可本地化和可编辑属性.您在上传构建版本或提交您的 App ...

  7. 获取设备上全部系统app信息

    在获取android设备的全部程序信息一文中介绍了获取手机上全部app信息的方法,以下介绍过滤掉系统app的方法: MainActivity: package com.home.getsysapp; ...

  8. 获取设备和 App 信息

    设备对照表:https://www.theiphonewiki.com/wiki/Models 获取设备和 App 信息代码: NSLog(@"设备信息如下"); NSLog(@& ...

  9. [App Store Connect帮助]三、管理 App 和版本(2.6)输入 App 信息:新增 watchOS App 信息

    如果您的 iOS App 中包含 watchOS App,请确保您的描述中包含该 App 在 Apple Watch 上的功能.您还需要为 Apple Watch 的 App Store 提供额外的屏 ...

随机推荐

  1. 团队作业4——第一次项目冲刺(Alpha版本)2017.4.25

    在下午的1,2节软件课程结束后,我们teamworkers全体队员在禹州楼302利用课间时间进行约15分钟的短暂会议,会议的内容为阐述昨天开发遇到的问题,大家都提出自己的看法,最后统一了意见,队员互相 ...

  2. 201521123115《Java程序设计》第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...

  3. 201521123016《Java设计与程序》第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 2. 书面作业 1.clone方法 1.1 Object对 ...

  4. Java 第四周总结

    1. 本周学习总结 2. 书面作业 注释的应用: (1)源文件注释采用 /** -- */,在每个源文件的头部要有必要的注释信息,包括:文件名:文件编号:版本号:作者:创建时间:文件描述包括本文件历史 ...

  5. [转载]sqlserver、Mysql、Oracle三种数据库的优缺点总结

    一.sqlserver优点:易用性.适合分布式组织的可伸缩性.用于决策支持的数据仓库功能.与许多其他服务器软件紧密关联的集成性.良好的性价比等:为数据管理与分析带来了灵活性,允许单位在快速变化的环境中 ...

  6. We Talk -- 团队博客

    WeTalk --在线群聊程序 团队博客 服务器一直在运行,使用客户端可直接登入使用.(做得很粗糙...) 客户端下载(java环境下直接运行) 0.项目介绍 现在我们网上交流离不开微信和QQ,当然在 ...

  7. Java课程设计-定时器

    Java课程设计--定时器 1.团队课程设计博客链接 团队博客地址 2.个人负责模块或任务说明 框架构建 时间设置面板,倒计时面板 按钮设置 3.自己的代码提交记录截图 4.自己负责模块或任务详细说明 ...

  8. 201521123057《Java程序设计》第14周学习总结

    0. 本周课程设计发布 Java课程设计 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 数据库基本操作(目前为止主要介绍了表的基本操作) 创建表 CREATE ...

  9. 201521123009 《Java程序设计》第10周学习总结

    1. 本周学习总结 2. 书面作业 本次PTA作业题集异常.多线程 Q1:finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? tr ...

  10. 201521123001《Java程序设计》第10周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 本次PTA作业题集异常.多线程 finally 题目4-2 1.1 截图你的提交结果(出现学 ...