经过 PackageManager 得到你想要的 App 信息

/top.png
/top.png

1、前言

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

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

2、须要提早了解的一些类

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

你首先须要获取 PackageManager(如下简称 PM) 对象,经过 PM 对象,你就能够获取到你须要的各项 App 的信息类。ide

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

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

/manifest.png
/manifest.png

能够看到,它们之间的关系还它挺复杂的。线程

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

2.1 PackageManager

PackageManager 是一个抽象类,咱们通常操做的 PackageManager ,其实是它的实现类 ApplicationPackageManager 这个对象。code

在 Context 中,就有获取 PM 对象的方法,getPackageManager(),因此四大组件想要获取它是很是简单的。cdn

/getPackageManager.png
/getPackageManager.png

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 的信息的时候,不会获取到这么细致的数据,若是有,看看这几个类准没错。

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

3、基本操做

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

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

3.1 获取全部安装的 App

若是想要获取当前设备上已经安装的全部 App,可使用 getInstalledPackages() 方法获取到它全部的已安装 App 的 PackageInfo 。

/getdeviceApp.png
/getdeviceApp.png

PackageManager 中,不少方法都会须要传递一个 flags 的字段,它表示你当前须要获取到的 App 的信息。取值范围有挺多的,获取不一样的信息使用不一样的 Flags,一般若是没有额外的要求,直接使用 GET_ACTIVITYS 便可。

3.2 判断 App 是否安装

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

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

/isinstall.png
/isinstall.png

3.3 经过包名获取PackageInfo

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

/getPakcageInfo.png
/getPakcageInfo.png

3.4 获取版本号和版本名

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

/versionName.png
/versionName.png

3.5 获取 App 的名称

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

/getAppLabel.png
/getAppLabel.png

3.6 获取 App 的 Icon

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

/getApplicationIcon.png
/getApplicationIcon.png

3.5 根据Apk 文件,获取 PackageInfo

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

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

/getarchiveinfo.png
/getarchiveinfo.png

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

4、查缺补漏

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

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

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

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

推荐阅读:

公众号二维码.jpg
公众号二维码.jpg

点赞或者分享吧~

相关文章
相关标签/搜索